| # Copyright 2014 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import("//build/config/android/config.gni") |
| import("//build/config/android/rules.gni") |
| import("//build_overrides/v8.gni") |
| import("//chrome/android/chrome_public_apk_tmpl.gni") |
| import("//chrome/common/features.gni") |
| import("//chrome/version.gni") |
| import("//testing/test.gni") |
| import("//third_party/icu/config.gni") |
| import("//third_party/protobuf/proto_library.gni") |
| import("channel.gni") |
| import("java_sources.gni") |
| |
| manifest_package = "org.chromium.chrome" |
| |
| chrome_public_jinja_variables = default_chrome_public_jinja_variables + |
| [ "manifest_package=$manifest_package" ] |
| |
| chrome_sync_shell_jinja_variables = |
| default_chrome_public_jinja_variables + |
| [ "manifest_package=org.chromium.chrome.sync_shell" ] |
| |
| chrome_apk_gypi = exec_script("//build/gypi_to_gn.py", |
| [ rebase_path("chrome_apk.gyp") ], |
| "scope", |
| [ "chrome_apk.gyp" ]) |
| |
| chrome_android_paks_gypi = |
| exec_script("//build/gypi_to_gn.py", |
| [ |
| rebase_path("//chrome/chrome_android_paks.gypi"), |
| "--replace=<(PRODUCT_DIR)=$root_out_dir", |
| ], |
| "scope", |
| [ "//chrome/chrome_android_paks.gypi" ]) |
| |
| locale_pak_resources("chrome_locale_paks") { |
| sources = chrome_android_paks_gypi.chrome_android_pak_locale_resources |
| |
| deps = [ |
| "//chrome:packed_resources", |
| ] |
| } |
| |
| # GYP: //chrome/chrome.gyp:chrome_java (resources part) |
| android_resources("chrome_java_resources") { |
| resource_dirs = [ |
| "java/res", |
| "//chrome/android/java/res_chromium", |
| ] |
| deps = [ |
| ":chrome_locale_paks", |
| ":chrome_strings_grd", |
| "//chrome/app:java_strings_grd", |
| "//components/policy:app_restrictions_resources", |
| "//components/strings:components_strings_grd", |
| "//content/public/android:content_java_resources", |
| "//third_party/android_data_chart:android_data_chart_java_resources", |
| "//third_party/android_media:android_media_resources", |
| ] |
| custom_package = "org.chromium.chrome" |
| } |
| |
| # GYP: //chrome/chrome.gyp:chrome_strings_grd |
| java_strings_grd("chrome_strings_grd") { |
| grd_file = "java/strings/android_chrome_strings.grd" |
| outputs = [ |
| "values-am/android_chrome_strings.xml", |
| "values-ar/android_chrome_strings.xml", |
| "values-bg/android_chrome_strings.xml", |
| "values-ca/android_chrome_strings.xml", |
| "values-cs/android_chrome_strings.xml", |
| "values-da/android_chrome_strings.xml", |
| "values-de/android_chrome_strings.xml", |
| "values-el/android_chrome_strings.xml", |
| "values/android_chrome_strings.xml", |
| "values-en-rGB/android_chrome_strings.xml", |
| "values-es/android_chrome_strings.xml", |
| "values-es-rUS/android_chrome_strings.xml", |
| "values-fa/android_chrome_strings.xml", |
| "values-fi/android_chrome_strings.xml", |
| "values-tl/android_chrome_strings.xml", |
| "values-fr/android_chrome_strings.xml", |
| "values-hi/android_chrome_strings.xml", |
| "values-hr/android_chrome_strings.xml", |
| "values-hu/android_chrome_strings.xml", |
| "values-in/android_chrome_strings.xml", |
| "values-it/android_chrome_strings.xml", |
| "values-iw/android_chrome_strings.xml", |
| "values-ja/android_chrome_strings.xml", |
| "values-ko/android_chrome_strings.xml", |
| "values-lt/android_chrome_strings.xml", |
| "values-lv/android_chrome_strings.xml", |
| "values-nl/android_chrome_strings.xml", |
| "values-nb/android_chrome_strings.xml", |
| "values-pl/android_chrome_strings.xml", |
| "values-pt-rBR/android_chrome_strings.xml", |
| "values-pt-rPT/android_chrome_strings.xml", |
| "values-ro/android_chrome_strings.xml", |
| "values-ru/android_chrome_strings.xml", |
| "values-sk/android_chrome_strings.xml", |
| "values-sl/android_chrome_strings.xml", |
| "values-sr/android_chrome_strings.xml", |
| "values-sv/android_chrome_strings.xml", |
| "values-sw/android_chrome_strings.xml", |
| "values-th/android_chrome_strings.xml", |
| "values-tr/android_chrome_strings.xml", |
| "values-uk/android_chrome_strings.xml", |
| "values-vi/android_chrome_strings.xml", |
| "values-zh-rCN/android_chrome_strings.xml", |
| "values-zh/android_chrome_strings.xml", |
| ] |
| } |
| |
| # GYP: //chrome/chrome.gyp:chrome_java |
| android_library("chrome_java") { |
| deps = [ |
| "//base:base_java", |
| "//chrome/android/webapk/libs/client", |
| "//components/safe_json/android:safe_json_java", |
| "//components/variations/android:variations_java", |
| "//components/web_contents_delegate_android:web_contents_delegate_android_java", |
| "//components/web_restrictions:web_restrictions_java", |
| "//content/public/android:content_java", |
| "//media/base/android:media_java", |
| "//media/capture/video/android:capture_java", |
| "//media/midi:midi_java", |
| "//mojo/public/java:bindings", |
| "//mojo/public/java:system", |
| "//net/android:net_java", |
| "//printing:printing_java", |
| "//third_party/WebKit/public:android_mojo_bindings_java", |
| "//third_party/WebKit/public:blink_headers_java", |
| "//third_party/android_data_chart:android_data_chart_java", |
| "//third_party/android_media:android_media_java", |
| "//third_party/android_protobuf:protobuf_nano_javalib", |
| "//third_party/android_swipe_refresh:android_swipe_refresh_java", |
| "//third_party/android_tools:android_gcm_java", |
| "//third_party/android_tools:android_support_v13_java", |
| "//third_party/android_tools:android_support_v7_appcompat_java", |
| "//third_party/android_tools:android_support_v7_mediarouter_java", |
| "//third_party/android_tools:android_support_v7_mediarouter_resources", |
| "//third_party/android_tools:android_support_v7_recyclerview_java", |
| "//third_party/cacheinvalidation:cacheinvalidation_javalib", |
| "//third_party/cacheinvalidation:cacheinvalidation_proto_java", |
| "//third_party/gif_player:gif_player_java", |
| "//third_party/jsr-305:jsr_305_javalib", |
| "//third_party/leakcanary:leakcanary_java", |
| "//ui/android:ui_java", |
| "//ui/android:ui_java_resources", |
| google_play_services_library, |
| ] |
| |
| srcjar_deps = [ |
| ":chrome_android_java_enums_srcjar", |
| ":chrome_android_java_google_api_keys_srcjar", |
| ":chrome_version_srcjar", |
| ":resource_id_javagen", |
| "//base:base_build_config_gen", |
| "//chrome:content_setting_javagen", |
| "//chrome:content_settings_type_javagen", |
| "//chrome:data_use_ui_message_enum_javagen", |
| "//chrome:signin_metrics_enum_javagen", |
| ] |
| |
| # New versions of BuildConfig.java will be created when creating an apk. |
| jar_excluded_patterns = [ "*/BuildConfig.class" ] |
| |
| # TODO(sievers): Split java code into components. Not everything |
| # is really all that UI related here. |
| if (android_java_ui) { |
| # From java_sources.gni. |
| java_files = chrome_java_sources |
| |
| srcjar_deps += [ |
| ":custom_tabs_service_aidl", |
| "//chrome:page_info_connection_type_javagen", |
| "//chrome:website_settings_action_javagen", |
| "//components/infobars/core:infobar_enums_java", |
| "//components/offline_pages:offline_page_model_enums_java", |
| "//components/omnibox/browser:autocomplete_match_javagen", |
| "//components/omnibox/browser:autocomplete_match_type_javagen", |
| "//components/security_state:security_state_enums_java", |
| "//components/signin/core/browser:investigated_scenario_java", |
| ] |
| |
| deps += [ |
| ":chrome_java_resources", |
| ":document_tab_model_info_proto_java", |
| "//components/bookmarks/common/android:bookmarks_java", |
| "//components/dom_distiller/android:dom_distiller_content_java", |
| "//components/dom_distiller/android:dom_distiller_core_java", |
| "//components/gcm_driver/android:gcm_driver_java", |
| "//components/gcm_driver/instance_id/android:instance_id_driver_java", |
| "//components/invalidation/impl:java", |
| "//components/navigation_interception/android:navigation_interception_java", |
| "//components/policy/android:policy_java", |
| "//components/precache/android:precache_java", |
| "//components/service_tab_launcher:service_tab_launcher_java", |
| "//components/signin/core/browser/android:java", |
| "//components/web_contents_delegate_android:web_contents_delegate_android_java", |
| "//sync/android:sync_java", |
| ] |
| } |
| } |
| |
| # GYP: //chrome/chrome_browser.gypi:activity_type_ids_java |
| # GYP: //chrome/chrome_browser.gypi:connectivity_check_result_java |
| # GYP: //chrome/chrome_browser.gypi:shortcut_source_java |
| # GYP: //chrome/chrome_browser.gypi:profile_account_management_metrics_java |
| # GYP: //chrome/chrome_browser.gypi:tab_load_status_java |
| # GYP: //chrome/chrome_browser.gypi:infobar_action_type_java |
| |
| action("chrome_android_java_google_api_keys_srcjar") { |
| script = "//build/android/gyp/java_google_api_keys.py" |
| _output_path = "$target_gen_dir/$target_name.srcjar" |
| outputs = [ |
| _output_path, |
| ] |
| args = [ |
| "--srcjar", |
| rebase_path(_output_path, root_build_dir), |
| ] |
| } |
| |
| java_cpp_enum("chrome_android_java_enums_srcjar") { |
| sources = [ |
| "//chrome/browser/android/activity_type_ids.h", |
| "//chrome/browser/android/feedback/connectivity_checker.cc", |
| "//chrome/browser/android/ntp/most_visited_sites.cc", |
| "//chrome/browser/android/policy/policy_auditor.cc", |
| "//chrome/browser/android/shortcut_info.h", |
| "//chrome/browser/android/tab_android.h", |
| "//chrome/browser/browsing_data/browsing_data_counter_utils.h", |
| "//chrome/browser/browsing_data/browsing_data_remover.h", |
| "//chrome/browser/profiles/profile_metrics.h", |
| "//chrome/browser/ui/android/infobars/infobar_android.h", |
| ] |
| } |
| |
| # GYP: //chrome/chrome_browser.gypi:document_tab_model_info_proto_java |
| proto_java_library("document_tab_model_info_proto_java") { |
| proto_path = "java/src/org/chromium/chrome/browser/tabmodel/document" |
| sources = [ |
| "$proto_path/document_tab_model_info.proto", |
| ] |
| } |
| |
| # GYP: //chrome/chrome_browser.gypi:resource_id_java |
| java_cpp_template("resource_id_javagen") { |
| sources = [ |
| "java/ResourceId.template", |
| ] |
| package_name = "org/chromium/chrome/browser" |
| inputs = [ |
| "../browser/android/resource_id.h", |
| ] |
| } |
| |
| # GYP: //chrome/chrome_tests.gypi:chrome_junit_tests |
| junit_binary("chrome_junit_tests") { |
| # From java_sources.gni. |
| java_files = chrome_junit_test_java_sources |
| deps = [ |
| ":chrome_java", |
| ":chrome_java_resources", |
| "//base:base_java", |
| "//base:base_java_test_support", |
| "//base:base_junit_test_support", |
| "//components/bookmarks/common/android:bookmarks_java", |
| "//components/invalidation/impl:java", |
| "//components/web_restrictions:web_restrictions_java", |
| "//content/public/android:content_java", |
| "//net/android:net_java", |
| "//sync:sync_java_test_support", |
| "//sync/android:sync_java", |
| "//third_party/android_tools:android_support_v7_mediarouter_java", |
| "//third_party/android_tools:android_support_v7_recyclerview_java", |
| "//third_party/cacheinvalidation:cacheinvalidation_javalib", |
| "//third_party/junit:hamcrest", |
| "//ui/android:ui_java", |
| google_play_services_library, |
| ] |
| } |
| |
| # GYP: //chrome/chrome_android.gypi:chrome_version_java |
| chrome_version_java_dir = "$root_gen_dir/templates/chrome_version_java" |
| chrome_version_java_file = "$chrome_version_java_dir/org/chromium/chrome/browser/ChromeVersionConstants.java" |
| process_version("chrome_version_java") { |
| template_file = "java/ChromeVersionConstants.java.version" |
| output = chrome_version_java_file |
| extra_args = [ |
| "-e", |
| "CHANNEL=str.upper('$android_channel')", |
| ] |
| } |
| |
| zip("chrome_version_srcjar") { |
| inputs = [ |
| chrome_version_java_file, |
| ] |
| output = "$target_gen_dir/$target_name.srcjar" |
| base_dir = chrome_version_java_dir |
| deps = [ |
| ":chrome_version_java", |
| ] |
| } |
| |
| #GYP: //chrome/android/chrome_apk.gyp:custom_tabs_service_aidl |
| android_aidl("custom_tabs_service_aidl") { |
| import_include = "java/src/android/support/customtabs" |
| interface_file = "java/src/android/support/customtabs/common.aidl" |
| sources = [ |
| "java/src/android/support/customtabs/ICustomTabsCallback.aidl", |
| "java/src/android/support/customtabs/ICustomTabsService.aidl", |
| ] |
| } |
| |
| # GYP: //chrome/android/chrome_apk.gyp:chrome_test_java |
| android_library("chrome_test_java") { |
| testonly = true |
| |
| # From java_sources.gni. |
| java_files = chrome_test_java_sources |
| |
| deps = [ |
| "//base:base_java", |
| "//base:base_java_test_support", |
| "//chrome/android:chrome_java", |
| "//chrome/android:chrome_java_resources", |
| "//chrome/test/android:chrome_java_test_support", |
| "//components/bookmarks/common/android:bookmarks_java", |
| "//components/dom_distiller/android:dom_distiller_core_java", |
| "//components/gcm_driver/android:gcm_driver_java", |
| "//components/invalidation/impl:java", |
| "//components/invalidation/impl:javatests", |
| "//components/navigation_interception/android:navigation_interception_java", |
| "//components/policy/android:policy_java", |
| "//components/precache/android:precache_java", |
| "//components/precache/android:precache_javatests", |
| "//components/web_contents_delegate_android:web_contents_delegate_android_java", |
| "//components/web_restrictions:web_restrictions_java", |
| "//content/public/android:content_java", |
| "//content/public/test/android:content_java_test_support", |
| "//net/android:net_java", |
| "//net/android:net_java_test_support", |
| "//printing:printing_java", |
| "//sync:sync_java_test_support", |
| "//sync/android:sync_java", |
| "//sync/android:sync_javatests", |
| "//third_party/android_tools:android_support_v13_java", |
| "//third_party/android_tools:android_support_v7_appcompat_java", |
| "//third_party/android_tools:android_support_v7_recyclerview_java", |
| "//third_party/android_tools:legacy_http_javalib", |
| "//third_party/cacheinvalidation:cacheinvalidation_javalib", |
| "//third_party/jsr-305:jsr_305_javalib", |
| "//ui/android:ui_java", |
| "//ui/android:ui_javatests", |
| google_play_services_library, |
| ] |
| } |
| |
| # Overrides icon / name defined in chrome_java_resources. |
| android_resources("chrome_public_apk_resources") { |
| resource_dirs = [ "java/res_chromium" ] |
| |
| # Dep needed to ensure override works properly. |
| deps = [ |
| ":chrome_java_resources", |
| ] |
| } |
| |
| android_assets("chrome_public_apk_assets") { |
| sources = chrome_android_paks_gypi.chrome_android_pak_input_resources |
| sources += [ "$root_build_dir/resources.pak" ] |
| disable_compression = true |
| |
| deps = [ |
| "//chrome:packed_extra_resources", |
| "//chrome:packed_resources", |
| "//third_party/icu:icu_assets", |
| "//v8:v8_external_startup_data_assets", |
| ] |
| } |
| |
| # GYP: //chrome/android/chrome_apk.gyp:chrome_apk_manifest |
| jinja_template("chrome_public_apk_manifest") { |
| input = "java/AndroidManifest.xml" |
| output = "$root_gen_dir/chrome_public_apk_manifest/AndroidManifest.xml" |
| variables = chrome_public_jinja_variables |
| variables += [ |
| "min_sdk_version=16", |
| "target_sdk_version=23", |
| ] |
| } |
| |
| # GYP: //chrome/android/chrome_apk.gyp:chrome_sync_shell_apk_manifest |
| jinja_template("chrome_sync_shell_apk_manifest") { |
| input = "java/AndroidManifest.xml" |
| output = "$root_gen_dir/chrome_sync_shell_apk_manifest/AndroidManifest.xml" |
| variables = chrome_sync_shell_jinja_variables |
| variables += [ |
| "min_sdk_version=16", |
| "target_sdk_version=22", |
| ] |
| } |
| |
| # GYP: //chrome/android/chrome_apk.gyp:chrome_public_apk_template_resources |
| jinja_template_resources("chrome_public_apk_template_resources") { |
| resources = [ |
| "java/res_template/xml/chromebackupscheme.xml", |
| "java/res_template/xml/searchable.xml", |
| "java/res_template/xml/syncadapter.xml", |
| ] |
| res_dir = "java/res_template" |
| variables = chrome_public_jinja_variables |
| } |
| |
| # GYP: //chrome/android/chrome_apk.gyp:chrome_sync_shell_apk_template_resources |
| jinja_template_resources("chrome_sync_shell_apk_template_resources") { |
| resources = [ |
| "java/res_template/xml/chromebackupscheme.xml", |
| "java/res_template/xml/searchable.xml", |
| "java/res_template/xml/syncadapter.xml", |
| ] |
| res_dir = "java/res_template" |
| variables = chrome_sync_shell_jinja_variables |
| } |
| |
| # GYP: none |
| shared_library("chrome") { |
| sources = chrome_apk_gypi.chrome_app_native_sources |
| deps = [ |
| "//build/config/sanitizers:deps", |
| "//chrome:chrome_android_core", |
| ] |
| |
| if (is_android && use_order_profiling) { |
| deps += [ "//tools/cygprofile" ] |
| } |
| |
| public_configs = extra_chrome_shared_library_configs |
| } |
| |
| # GYP: none |
| if (!defined(webview_only_libmonochrome) || !webview_only_libmonochrome) { |
| shared_library("monochrome") { |
| sources = chrome_apk_gypi.monochrome_app_native_sources |
| deps = [ |
| "//android_webview:common", |
| "//chrome:chrome_android_core", |
| ] |
| |
| configs -= [ "//build/config/android:hide_native_jni_exports" ] |
| if (is_android && use_order_profiling) { |
| deps += [ "//tools/cygprofile" ] |
| } |
| |
| public_configs = extra_chrome_shared_library_configs |
| } |
| } |
| |
| # GYP: //chrome/android/chrome_apk.gyp:libchrome_sync_shell |
| shared_library("chrome_sync_shell") { |
| testonly = true |
| deps = [ |
| "//build/config/sanitizers:deps", |
| "//chrome:chrome_android_core", |
| "//sync", |
| "//sync:test_support_sync_fake_server_android", |
| ] |
| sources = chrome_apk_gypi.chrome_sync_shell_app_native_sources |
| } |
| |
| # Contains rules common to chrome_public_apk and chrome_sync_shell_apk |
| template("chrome_public_apk_tmpl_shared") { |
| chrome_public_apk_tmpl(target_name) { |
| forward_variables_from(invoker, "*") |
| |
| native_lib_version_rule = "//build/util:chrome_version_json" |
| |
| deps += [ |
| ":chrome_java", |
| ":chrome_public_apk_assets", |
| ":chrome_public_apk_resources", |
| "//base:base_java", |
| google_play_services_resources, |
| ] |
| } |
| } |
| |
| chrome_public_apk_tmpl_shared("chrome_public_apk") { |
| android_manifest = get_target_outputs(":chrome_public_apk_manifest") |
| android_manifest = android_manifest[1] |
| apk_name = "ChromePublic" |
| native_libs = [ "libchrome.so" ] |
| |
| deps = [ |
| ":chrome", |
| ":chrome_public_apk_manifest", |
| ":chrome_public_apk_template_resources", |
| ] |
| } |
| |
| chrome_public_apk_tmpl_shared("chrome_sync_shell_apk") { |
| testonly = true |
| android_manifest = get_target_outputs(":chrome_sync_shell_apk_manifest") |
| android_manifest = android_manifest[1] |
| apk_name = "ChromeSyncShell" |
| native_libs = [ "libchrome_sync_shell.so" ] |
| |
| deps = [ |
| ":chrome_sync_shell", |
| ":chrome_sync_shell_apk_manifest", |
| ":chrome_sync_shell_apk_template_resources", |
| |
| # This exists here because com.google.protobuf.nano is needed in tests, |
| # but that code is stripped out via proguard. Adding this deps adds |
| # usages and prevents removal of the proto code. |
| "//sync:test_support_sync_proto_java", |
| ] |
| } |
| |
| chrome_public_test_apk_manifest = |
| "$root_gen_dir/chrome_public_test_apk_manifest/AndroidManifest.xml" |
| chrome_sync_shell_test_apk_manifest = |
| "$root_gen_dir/chrome_sync_shell_test_apk_manifest/AndroidManifest.xml" |
| |
| # GYP: //chrome/android/chrome_apk.gyp:chrome_public_test_apk_manifest |
| jinja_template("chrome_public_test_apk_manifest") { |
| input = "javatests/AndroidManifest.xml" |
| output = chrome_public_test_apk_manifest |
| variables = chrome_public_jinja_variables |
| } |
| |
| # GYP: //chrome/android/chrome_apk.gyp:chrome_sync_shell_test_apk_manifest |
| jinja_template("chrome_sync_shell_test_apk_manifest") { |
| input = "sync_shell/javatests/AndroidManifest.xml" |
| output = chrome_sync_shell_test_apk_manifest |
| variables = chrome_sync_shell_jinja_variables |
| } |
| |
| # GYP: //chrome/android/chrome_apk.gyp:chrome_public_test_apk |
| instrumentation_test_apk("chrome_public_test_apk") { |
| apk_name = "ChromePublicTest" |
| apk_under_test = ":chrome_public_apk" |
| android_manifest = chrome_public_test_apk_manifest |
| |
| deps = [ |
| ":chrome_public_test_apk_manifest", |
| ":chrome_test_java", |
| "//chrome/android/webapk/shell_apk:shell_apk_javatests", |
| ] |
| additional_apks = [ |
| "//chrome/android/webapk/shell_apk/javatests/dex_optimizer:dex_optimizer_apk", |
| "//chrome/test/android/chrome_public_test_support:chrome_public_test_support_apk", |
| "//net/android:net_test_support_apk", |
| ] |
| isolate_file = "../chrome_public_test_apk.isolate" |
| proguard_enabled = !is_debug |
| } |
| |
| android_library("chrome_sync_shell_test_apk_java") { |
| testonly = true |
| |
| # From java_sources.jni. |
| java_files = sync_shell_test_java_sources |
| |
| deps = [ |
| "//base:base_java", |
| "//base:base_java_test_support", |
| "//chrome/android:chrome_java", |
| "//chrome/android:chrome_java_resources", |
| "//chrome/test/android:chrome_java_test_support", |
| "//components/bookmarks/common/android:bookmarks_java", |
| "//components/policy/android:policy_java", |
| "//content/public/android:content_java", |
| "//content/public/test/android:content_java_test_support", |
| "//sync:sync_java_test_support", |
| "//sync:test_support_sync_proto_java", |
| "//sync/android:sync_java", |
| "//third_party/android_protobuf:protobuf_nano_javalib", |
| "//third_party/android_tools:android_support_v13_java", |
| "//third_party/android_tools:android_support_v7_appcompat_java", |
| "//ui/android:ui_java", |
| ] |
| } |
| |
| # GYP: //chrome/android/chrome_apk.gyp:chrome_sync_shell_test_apk |
| instrumentation_test_apk("chrome_sync_shell_test_apk") { |
| apk_name = "ChromeSyncShellTest" |
| apk_under_test = ":chrome_sync_shell_apk" |
| android_manifest = chrome_sync_shell_test_apk_manifest |
| deps = [ |
| ":chrome_sync_shell_test_apk_java", |
| ":chrome_sync_shell_test_apk_manifest", |
| ] |
| proguard_enabled = !is_debug |
| } |