From 81f1f5c2b460bb5632f90a1ef748b31eaaf798f1 Mon Sep 17 00:00:00 2001 From: marc-n-dream Date: Thu, 11 Dec 2025 09:18:14 +0100 Subject: [PATCH 01/11] e: Add code style configuration --- .editorconfig | 4139 +++++++++++++++++ .gitignore | 17 +- .../.idea/codeStyles/Project.xml | 17 + .../.idea/codeStyles/codeStyleConfig.xml | 5 + 4 files changed, 4172 insertions(+), 6 deletions(-) create mode 100644 .editorconfig create mode 100644 .idea/.idea.airconsole-unity-plugin/.idea/codeStyles/Project.xml create mode 100644 .idea/.idea.airconsole-unity-plugin/.idea/codeStyles/codeStyleConfig.xml diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..0a4a3f24 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4139 @@ + +[*] +charset = utf-8 +end_of_line = lf +trim_trailing_whitespace = false +insert_final_newline = false +indent_style = space +indent_size = 4 + +# Microsoft .NET properties +csharp_indent_braces = false +csharp_indent_switch_labels = true +csharp_new_line_before_catch = false +csharp_new_line_before_else = false +csharp_new_line_before_finally = false +csharp_new_line_before_members_in_object_initializers = false +csharp_new_line_before_open_brace = none +csharp_new_line_between_query_expression_clauses = true +csharp_preferred_modifier_order = public, private, protected, internal, file, new, static, abstract, virtual, sealed, readonly, override, extern, unsafe, volatile, async, required:suggestion +csharp_prefer_braces = true:none +csharp_preserve_single_line_blocks = true +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false +csharp_style_namespace_declarations = file_scoped:suggestion +csharp_style_prefer_utf8_string_literals = true:suggestion +csharp_style_var_elsewhere = false:suggestion +csharp_style_var_for_built_in_types = false:suggestion +csharp_style_var_when_type_is_apparent = false:suggestion +csharp_using_directive_placement = inside_namespace:silent +dotnet_diagnostic.bc40000.severity = warning +dotnet_diagnostic.bc400005.severity = warning +dotnet_diagnostic.bc40008.severity = warning +dotnet_diagnostic.bc40056.severity = warning +dotnet_diagnostic.bc42016.severity = warning +dotnet_diagnostic.bc42024.severity = warning +dotnet_diagnostic.bc42025.severity = warning +dotnet_diagnostic.bc42104.severity = warning +dotnet_diagnostic.bc42105.severity = warning +dotnet_diagnostic.bc42106.severity = warning +dotnet_diagnostic.bc42107.severity = warning +dotnet_diagnostic.bc42304.severity = warning +dotnet_diagnostic.bc42309.severity = warning +dotnet_diagnostic.bc42322.severity = warning +dotnet_diagnostic.bc42349.severity = warning +dotnet_diagnostic.bc42353.severity = warning +dotnet_diagnostic.bc42354.severity = warning +dotnet_diagnostic.bc42355.severity = warning +dotnet_diagnostic.bc42356.severity = warning +dotnet_diagnostic.bc42358.severity = warning +dotnet_diagnostic.bc42380.severity = warning +dotnet_diagnostic.bc42504.severity = warning +dotnet_diagnostic.bc42505.severity = warning +dotnet_diagnostic.ca2252.severity = error +dotnet_diagnostic.ca2254.severity = suggestion +dotnet_diagnostic.cs0067.severity = warning +dotnet_diagnostic.cs0078.severity = warning +dotnet_diagnostic.cs0108.severity = warning +dotnet_diagnostic.cs0109.severity = warning +dotnet_diagnostic.cs0114.severity = warning +dotnet_diagnostic.cs0162.severity = warning +dotnet_diagnostic.cs0164.severity = warning +dotnet_diagnostic.cs0168.severity = warning +dotnet_diagnostic.cs0169.severity = warning +dotnet_diagnostic.cs0183.severity = warning +dotnet_diagnostic.cs0184.severity = warning +dotnet_diagnostic.cs0197.severity = warning +dotnet_diagnostic.cs0219.severity = warning +dotnet_diagnostic.cs0252.severity = warning +dotnet_diagnostic.cs0253.severity = warning +dotnet_diagnostic.cs0282.severity = warning +dotnet_diagnostic.cs0414.severity = warning +dotnet_diagnostic.cs0420.severity = warning +dotnet_diagnostic.cs0458.severity = warning +dotnet_diagnostic.cs0464.severity = warning +dotnet_diagnostic.cs0465.severity = warning +dotnet_diagnostic.cs0469.severity = warning +dotnet_diagnostic.cs0472.severity = warning +dotnet_diagnostic.cs0612.severity = warning +dotnet_diagnostic.cs0618.severity = warning +dotnet_diagnostic.cs0628.severity = warning +dotnet_diagnostic.cs0642.severity = warning +dotnet_diagnostic.cs0649.severity = warning +dotnet_diagnostic.cs0652.severity = warning +dotnet_diagnostic.cs0657.severity = warning +dotnet_diagnostic.cs0658.severity = warning +dotnet_diagnostic.cs0659.severity = warning +dotnet_diagnostic.cs0660.severity = warning +dotnet_diagnostic.cs0661.severity = warning +dotnet_diagnostic.cs0665.severity = warning +dotnet_diagnostic.cs0672.severity = warning +dotnet_diagnostic.cs0675.severity = warning +dotnet_diagnostic.cs0693.severity = warning +dotnet_diagnostic.cs0728.severity = warning +dotnet_diagnostic.cs0809.severity = warning +dotnet_diagnostic.cs1030.severity = warning +dotnet_diagnostic.cs1058.severity = warning +dotnet_diagnostic.cs1066.severity = warning +dotnet_diagnostic.cs1522.severity = warning +dotnet_diagnostic.cs1570.severity = warning +dotnet_diagnostic.cs1571.severity = warning +dotnet_diagnostic.cs1572.severity = warning +dotnet_diagnostic.cs1573.severity = warning +dotnet_diagnostic.cs1574.severity = warning +dotnet_diagnostic.cs1580.severity = warning +dotnet_diagnostic.cs1581.severity = warning +dotnet_diagnostic.cs1584.severity = warning +dotnet_diagnostic.cs1587.severity = warning +dotnet_diagnostic.cs1589.severity = warning +dotnet_diagnostic.cs1590.severity = warning +dotnet_diagnostic.cs1591.severity = warning +dotnet_diagnostic.cs1592.severity = warning +dotnet_diagnostic.cs1687.severity = warning +dotnet_diagnostic.cs1710.severity = warning +dotnet_diagnostic.cs1711.severity = warning +dotnet_diagnostic.cs1712.severity = warning +dotnet_diagnostic.cs1717.severity = warning +dotnet_diagnostic.cs1723.severity = warning +dotnet_diagnostic.cs1911.severity = warning +dotnet_diagnostic.cs1957.severity = warning +dotnet_diagnostic.cs1981.severity = warning +dotnet_diagnostic.cs1998.severity = warning +dotnet_diagnostic.cs4014.severity = warning +dotnet_diagnostic.cs4024.severity = warning +dotnet_diagnostic.cs4025.severity = warning +dotnet_diagnostic.cs4026.severity = warning +dotnet_diagnostic.cs7022.severity = warning +dotnet_diagnostic.cs7023.severity = warning +dotnet_diagnostic.cs7080.severity = warning +dotnet_diagnostic.cs7081.severity = warning +dotnet_diagnostic.cs7082.severity = warning +dotnet_diagnostic.cs7095.severity = warning +dotnet_diagnostic.cs8073.severity = warning +dotnet_diagnostic.cs8094.severity = warning +dotnet_diagnostic.cs8123.severity = warning +dotnet_diagnostic.cs8305.severity = warning +dotnet_diagnostic.cs8321.severity = warning +dotnet_diagnostic.cs8383.severity = warning +dotnet_diagnostic.cs8424.severity = warning +dotnet_diagnostic.cs8425.severity = warning +dotnet_diagnostic.cs8500.severity = warning +dotnet_diagnostic.cs8509.severity = warning +dotnet_diagnostic.cs8519.severity = warning +dotnet_diagnostic.cs8520.severity = warning +dotnet_diagnostic.cs8524.severity = warning +dotnet_diagnostic.cs8597.severity = warning +dotnet_diagnostic.cs8600.severity = warning +dotnet_diagnostic.cs8601.severity = warning +dotnet_diagnostic.cs8602.severity = warning +dotnet_diagnostic.cs8603.severity = warning +dotnet_diagnostic.cs8604.severity = warning +dotnet_diagnostic.cs8605.severity = warning +dotnet_diagnostic.cs8607.severity = warning +dotnet_diagnostic.cs8608.severity = warning +dotnet_diagnostic.cs8609.severity = warning +dotnet_diagnostic.cs8610.severity = warning +dotnet_diagnostic.cs8611.severity = warning +dotnet_diagnostic.cs8612.severity = warning +dotnet_diagnostic.cs8613.severity = warning +dotnet_diagnostic.cs8614.severity = warning +dotnet_diagnostic.cs8615.severity = warning +dotnet_diagnostic.cs8616.severity = warning +dotnet_diagnostic.cs8617.severity = warning +dotnet_diagnostic.cs8618.severity = warning +dotnet_diagnostic.cs8619.severity = warning +dotnet_diagnostic.cs8620.severity = warning +dotnet_diagnostic.cs8621.severity = warning +dotnet_diagnostic.cs8622.severity = warning +dotnet_diagnostic.cs8624.severity = warning +dotnet_diagnostic.cs8625.severity = warning +dotnet_diagnostic.cs8629.severity = warning +dotnet_diagnostic.cs8631.severity = warning +dotnet_diagnostic.cs8632.severity = warning +dotnet_diagnostic.cs8633.severity = warning +dotnet_diagnostic.cs8634.severity = warning +dotnet_diagnostic.cs8643.severity = warning +dotnet_diagnostic.cs8644.severity = warning +dotnet_diagnostic.cs8645.severity = warning +dotnet_diagnostic.cs8655.severity = warning +dotnet_diagnostic.cs8656.severity = warning +dotnet_diagnostic.cs8667.severity = warning +dotnet_diagnostic.cs8669.severity = warning +dotnet_diagnostic.cs8670.severity = warning +dotnet_diagnostic.cs8714.severity = warning +dotnet_diagnostic.cs8762.severity = warning +dotnet_diagnostic.cs8763.severity = warning +dotnet_diagnostic.cs8764.severity = warning +dotnet_diagnostic.cs8765.severity = warning +dotnet_diagnostic.cs8766.severity = warning +dotnet_diagnostic.cs8767.severity = warning +dotnet_diagnostic.cs8768.severity = warning +dotnet_diagnostic.cs8769.severity = warning +dotnet_diagnostic.cs8770.severity = warning +dotnet_diagnostic.cs8774.severity = warning +dotnet_diagnostic.cs8775.severity = warning +dotnet_diagnostic.cs8776.severity = warning +dotnet_diagnostic.cs8777.severity = warning +dotnet_diagnostic.cs8794.severity = warning +dotnet_diagnostic.cs8819.severity = warning +dotnet_diagnostic.cs8824.severity = warning +dotnet_diagnostic.cs8825.severity = warning +dotnet_diagnostic.cs8846.severity = warning +dotnet_diagnostic.cs8847.severity = warning +dotnet_diagnostic.cs8851.severity = warning +dotnet_diagnostic.cs8860.severity = warning +dotnet_diagnostic.cs8892.severity = warning +dotnet_diagnostic.cs8907.severity = warning +dotnet_diagnostic.cs8947.severity = warning +dotnet_diagnostic.cs8960.severity = warning +dotnet_diagnostic.cs8961.severity = warning +dotnet_diagnostic.cs8962.severity = warning +dotnet_diagnostic.cs8963.severity = warning +dotnet_diagnostic.cs8965.severity = warning +dotnet_diagnostic.cs8966.severity = warning +dotnet_diagnostic.cs8971.severity = warning +dotnet_diagnostic.cs8974.severity = warning +dotnet_diagnostic.cs8981.severity = warning +dotnet_diagnostic.cs9042.severity = warning +dotnet_diagnostic.cs9073.severity = warning +dotnet_diagnostic.cs9074.severity = warning +dotnet_diagnostic.cs9080.severity = warning +dotnet_diagnostic.cs9081.severity = warning +dotnet_diagnostic.cs9082.severity = warning +dotnet_diagnostic.cs9083.severity = warning +dotnet_diagnostic.cs9084.severity = warning +dotnet_diagnostic.cs9085.severity = warning +dotnet_diagnostic.cs9086.severity = warning +dotnet_diagnostic.cs9087.severity = warning +dotnet_diagnostic.cs9088.severity = warning +dotnet_diagnostic.cs9089.severity = warning +dotnet_diagnostic.cs9090.severity = warning +dotnet_diagnostic.cs9091.severity = warning +dotnet_diagnostic.cs9092.severity = warning +dotnet_diagnostic.cs9093.severity = warning +dotnet_diagnostic.cs9094.severity = warning +dotnet_diagnostic.cs9095.severity = warning +dotnet_diagnostic.cs9097.severity = warning +dotnet_diagnostic.cs9099.severity = warning +dotnet_diagnostic.cs9100.severity = warning +dotnet_diagnostic.cs9107.severity = warning +dotnet_diagnostic.cs9113.severity = warning +dotnet_diagnostic.cs9123.severity = warning +dotnet_diagnostic.cs9124.severity = warning +dotnet_diagnostic.cs9154.severity = warning +dotnet_diagnostic.cs9158.severity = warning +dotnet_diagnostic.cs9159.severity = warning +dotnet_diagnostic.cs9179.severity = warning +dotnet_diagnostic.cs9181.severity = warning +dotnet_diagnostic.cs9182.severity = warning +dotnet_diagnostic.cs9183.severity = warning +dotnet_diagnostic.cs9184.severity = warning +dotnet_diagnostic.cs9191.severity = warning +dotnet_diagnostic.cs9192.severity = warning +dotnet_diagnostic.cs9193.severity = warning +dotnet_diagnostic.cs9195.severity = warning +dotnet_diagnostic.cs9196.severity = warning +dotnet_diagnostic.cs9197.severity = warning +dotnet_diagnostic.cs9198.severity = warning +dotnet_diagnostic.cs9200.severity = warning +dotnet_diagnostic.cs9204.severity = warning +dotnet_diagnostic.cs9208.severity = warning +dotnet_diagnostic.cs9209.severity = warning +dotnet_diagnostic.cs9216.severity = warning +dotnet_diagnostic.cs9256.severity = warning +dotnet_diagnostic.cs9258.severity = warning +dotnet_diagnostic.cs9264.severity = warning +dotnet_diagnostic.cs9266.severity = warning +dotnet_diagnostic.fs0020.severity = warning +dotnet_diagnostic.fs0025.severity = warning +dotnet_diagnostic.fs0026.severity = warning +dotnet_diagnostic.fs0066.severity = warning +dotnet_diagnostic.fs0067.severity = warning +dotnet_diagnostic.fs0104.severity = warning +dotnet_diagnostic.fs0193.severity = warning +dotnet_diagnostic.fs0524.severity = warning +dotnet_diagnostic.fs1182.severity = warning +dotnet_diagnostic.fs1183.severity = warning +dotnet_diagnostic.fs3218.severity = warning +dotnet_diagnostic.fs3390.severity = warning +dotnet_diagnostic.fs3520.severity = warning +dotnet_diagnostic.syslib1014.severity = warning +dotnet_diagnostic.wme006.severity = warning +dotnet_naming_rule.constants_rule.import_to_resharper = True +dotnet_naming_rule.constants_rule.resharper_description = Constant fields (not private) +dotnet_naming_rule.constants_rule.resharper_guid = 669e5282-fb4b-4e90-91e7-07d269d04b60 +dotnet_naming_rule.constants_rule.severity = warning +dotnet_naming_rule.constants_rule.style = upper_camel_case_style +dotnet_naming_rule.constants_rule.symbols = constants_symbols +dotnet_naming_rule.enum_member_rule.import_to_resharper = True +dotnet_naming_rule.enum_member_rule.resharper_description = Enum members +dotnet_naming_rule.enum_member_rule.resharper_guid = 8b8504e3-f0be-4c14-9103-c732f2bddc15 +dotnet_naming_rule.enum_member_rule.severity = warning +dotnet_naming_rule.enum_member_rule.style = upper_camel_case_style +dotnet_naming_rule.enum_member_rule.symbols = enum_member_symbols +dotnet_naming_rule.event_rule.import_to_resharper = True +dotnet_naming_rule.event_rule.resharper_description = Events +dotnet_naming_rule.event_rule.resharper_guid = 0c4c6401-2a1f-4db1-a21f-562f51542cf8 +dotnet_naming_rule.event_rule.resharper_style = aaBb, AaBb +dotnet_naming_rule.event_rule.severity = warning +dotnet_naming_rule.event_rule.style = lower_camel_case_style_1 +dotnet_naming_rule.event_rule.symbols = event_symbols +dotnet_naming_rule.interfaces_rule.import_to_resharper = True +dotnet_naming_rule.interfaces_rule.resharper_description = Interfaces +dotnet_naming_rule.interfaces_rule.resharper_guid = a7a3339e-4e89-4319-9735-a9dc4cb74cc7 +dotnet_naming_rule.interfaces_rule.severity = warning +dotnet_naming_rule.interfaces_rule.style = i_upper_camel_case_style +dotnet_naming_rule.interfaces_rule.symbols = interfaces_symbols +dotnet_naming_rule.locals_rule.import_to_resharper = True +dotnet_naming_rule.locals_rule.resharper_description = Local variables +dotnet_naming_rule.locals_rule.resharper_guid = 61a991a4-d0a3-4d19-90a5-f8f4d75c30c1 +dotnet_naming_rule.locals_rule.severity = warning +dotnet_naming_rule.locals_rule.style = lower_camel_case_style_1 +dotnet_naming_rule.locals_rule.symbols = locals_symbols +dotnet_naming_rule.local_constants_rule.import_to_resharper = True +dotnet_naming_rule.local_constants_rule.resharper_description = Local constants +dotnet_naming_rule.local_constants_rule.resharper_guid = a4f433b8-abcd-4e55-a08f-82e78cef0f0c +dotnet_naming_rule.local_constants_rule.severity = warning +dotnet_naming_rule.local_constants_rule.style = lower_camel_case_style_1 +dotnet_naming_rule.local_constants_rule.symbols = local_constants_symbols +dotnet_naming_rule.local_functions_rule.import_to_resharper = True +dotnet_naming_rule.local_functions_rule.resharper_description = Local functions +dotnet_naming_rule.local_functions_rule.resharper_guid = 76f79b1e-ece7-4df2-a322-1bd7fea25eb7 +dotnet_naming_rule.local_functions_rule.severity = warning +dotnet_naming_rule.local_functions_rule.style = upper_camel_case_style +dotnet_naming_rule.local_functions_rule.symbols = local_functions_symbols +dotnet_naming_rule.method_rule.import_to_resharper = True +dotnet_naming_rule.method_rule.resharper_description = Methods +dotnet_naming_rule.method_rule.resharper_guid = 8284009d-e743-4d89-9402-a5bf9a89b657 +dotnet_naming_rule.method_rule.severity = warning +dotnet_naming_rule.method_rule.style = upper_camel_case_style +dotnet_naming_rule.method_rule.symbols = method_symbols +dotnet_naming_rule.parameters_rule.import_to_resharper = True +dotnet_naming_rule.parameters_rule.resharper_description = Parameters +dotnet_naming_rule.parameters_rule.resharper_guid = 8a85b61a-1024-4f87-b9ef-1fdae19930a1 +dotnet_naming_rule.parameters_rule.severity = warning +dotnet_naming_rule.parameters_rule.style = lower_camel_case_style_1 +dotnet_naming_rule.parameters_rule.symbols = parameters_symbols +dotnet_naming_rule.private_constants_rule.import_to_resharper = True +dotnet_naming_rule.private_constants_rule.resharper_description = Constant fields (private) +dotnet_naming_rule.private_constants_rule.resharper_guid = 236f7aa5-7b06-43ca-bf2a-9b31bfcff09a +dotnet_naming_rule.private_constants_rule.severity = warning +dotnet_naming_rule.private_constants_rule.style = upper_camel_case_style +dotnet_naming_rule.private_constants_rule.symbols = private_constants_symbols +dotnet_naming_rule.private_instance_fields_rule.import_to_resharper = True +dotnet_naming_rule.private_instance_fields_rule.resharper_description = Instance fields (private) +dotnet_naming_rule.private_instance_fields_rule.resharper_guid = 4a98fdf6-7d98-4f5a-afeb-ea44ad98c70c +dotnet_naming_rule.private_instance_fields_rule.severity = warning +dotnet_naming_rule.private_instance_fields_rule.style = lower_camel_case_style +dotnet_naming_rule.private_instance_fields_rule.symbols = private_instance_fields_symbols +dotnet_naming_rule.private_static_fields_rule.import_to_resharper = True +dotnet_naming_rule.private_static_fields_rule.resharper_description = Static fields (private) +dotnet_naming_rule.private_static_fields_rule.resharper_exclusive_prefixes_suffixes = true +dotnet_naming_rule.private_static_fields_rule.resharper_guid = f9fce829-e6f4-4cb2-80f1-5497c44f51df +dotnet_naming_rule.private_static_fields_rule.severity = warning +dotnet_naming_rule.private_static_fields_rule.style = lower_camel_case_style +dotnet_naming_rule.private_static_readonly_rule.import_to_resharper = True +dotnet_naming_rule.private_static_readonly_rule.resharper_description = Static readonly fields (private) +dotnet_naming_rule.private_static_readonly_rule.resharper_guid = 15b5b1f1-457c-4ca6-b278-5615aedc07d3 +dotnet_naming_rule.private_static_readonly_rule.severity = warning +dotnet_naming_rule.private_static_readonly_rule.style = upper_camel_case_style +dotnet_naming_rule.property_rule.import_to_resharper = True +dotnet_naming_rule.property_rule.resharper_description = Properties +dotnet_naming_rule.property_rule.resharper_guid = c85a0503-4de2-40f1-9cd6-a4054c05d384 +dotnet_naming_rule.property_rule.resharper_style = aaBb, AaBb +dotnet_naming_rule.property_rule.severity = warning +dotnet_naming_rule.property_rule.style = lower_camel_case_style_1 +dotnet_naming_rule.property_rule.symbols = property_symbols +dotnet_naming_rule.public_fields_rule.import_to_resharper = True +dotnet_naming_rule.public_fields_rule.resharper_description = Instance fields (not private) +dotnet_naming_rule.public_fields_rule.resharper_guid = 53eecf85-d821-40e8-ac97-fdb734542b84 +dotnet_naming_rule.public_fields_rule.severity = warning +dotnet_naming_rule.public_fields_rule.style = upper_camel_case_style +dotnet_naming_rule.public_fields_rule.symbols = public_fields_symbols +dotnet_naming_rule.public_static_fields_rule.import_to_resharper = True +dotnet_naming_rule.public_static_fields_rule.resharper_description = Static fields (not private) +dotnet_naming_rule.public_static_fields_rule.resharper_guid = 70345118-4b40-4ece-937c-bbeb7a0b2e70 +dotnet_naming_rule.public_static_fields_rule.severity = warning +dotnet_naming_rule.public_static_fields_rule.style = upper_camel_case_style +dotnet_naming_rule.public_static_fields_rule.symbols = public_static_fields_symbols +dotnet_naming_rule.static_readonly_rule.import_to_resharper = True +dotnet_naming_rule.static_readonly_rule.resharper_description = Static readonly fields (not private) +dotnet_naming_rule.static_readonly_rule.resharper_guid = c873eafb-d57f-481d-8c93-77f6863c2f88 +dotnet_naming_rule.static_readonly_rule.severity = warning +dotnet_naming_rule.static_readonly_rule.style = upper_camel_case_style +dotnet_naming_rule.static_readonly_rule.symbols = static_readonly_symbols +dotnet_naming_rule.types_and_namespaces_rule.import_to_resharper = True +dotnet_naming_rule.types_and_namespaces_rule.resharper_description = Types and namespaces +dotnet_naming_rule.types_and_namespaces_rule.resharper_guid = a0b4bc4d-d13b-4a37-b37e-c9c6864e4302 +dotnet_naming_rule.types_and_namespaces_rule.severity = warning +dotnet_naming_rule.types_and_namespaces_rule.style = upper_camel_case_style +dotnet_naming_rule.types_and_namespaces_rule.symbols = types_and_namespaces_symbols +dotnet_naming_rule.type_parameters_rule.import_to_resharper = True +dotnet_naming_rule.type_parameters_rule.resharper_description = Type parameters +dotnet_naming_rule.type_parameters_rule.resharper_exclusive_prefixes_suffixes = true +dotnet_naming_rule.type_parameters_rule.resharper_guid = 2c62818f-621b-4425-adc9-78611099bfcb +dotnet_naming_rule.type_parameters_rule.severity = warning +dotnet_naming_rule.type_parameters_rule.style = t_upper_camel_case_style +dotnet_naming_rule.type_parameters_rule.symbols = type_parameters_symbols +dotnet_naming_rule.unity_serialized_field_rule.import_to_resharper = True +dotnet_naming_rule.unity_serialized_field_rule.resharper_description = Unity serialized field +dotnet_naming_rule.unity_serialized_field_rule.resharper_guid = 5f0fdb63-c892-4d2c-9324-15c80b22a7ef +dotnet_naming_rule.unity_serialized_field_rule.severity = warning +dotnet_naming_rule.unity_serialized_field_rule.style = lower_camel_case_style_1 +dotnet_naming_rule.unity_serialized_field_rule.symbols = unity_serialized_field_symbols +dotnet_naming_style.i_upper_camel_case_style.capitalization = pascal_case +dotnet_naming_style.i_upper_camel_case_style.required_prefix = I +dotnet_naming_style.lower_camel_case_style.capitalization = camel_case +dotnet_naming_style.lower_camel_case_style.required_prefix = _ +dotnet_naming_style.lower_camel_case_style_1.capitalization = camel_case +dotnet_naming_style.t_upper_camel_case_style.capitalization = pascal_case +dotnet_naming_style.t_upper_camel_case_style.required_prefix = T +dotnet_naming_style.upper_camel_case_style.capitalization = pascal_case +dotnet_naming_symbols.constants_symbols.applicable_accessibilities = public,internal,protected,protected_internal,private_protected +dotnet_naming_symbols.constants_symbols.applicable_kinds = field +dotnet_naming_symbols.constants_symbols.required_modifiers = const +dotnet_naming_symbols.constants_symbols.resharper_applicable_kinds = constant_field +dotnet_naming_symbols.constants_symbols.resharper_required_modifiers = any +dotnet_naming_symbols.enum_member_symbols.applicable_accessibilities = * +dotnet_naming_symbols.enum_member_symbols.applicable_kinds = +dotnet_naming_symbols.enum_member_symbols.resharper_applicable_kinds = enum_member +dotnet_naming_symbols.enum_member_symbols.resharper_required_modifiers = any +dotnet_naming_symbols.event_symbols.applicable_accessibilities = * +dotnet_naming_symbols.event_symbols.applicable_kinds = event +dotnet_naming_symbols.event_symbols.resharper_applicable_kinds = event +dotnet_naming_symbols.event_symbols.resharper_required_modifiers = any +dotnet_naming_symbols.interfaces_symbols.applicable_accessibilities = * +dotnet_naming_symbols.interfaces_symbols.applicable_kinds = interface +dotnet_naming_symbols.interfaces_symbols.resharper_applicable_kinds = interface +dotnet_naming_symbols.interfaces_symbols.resharper_required_modifiers = any +dotnet_naming_symbols.locals_symbols.applicable_accessibilities = * +dotnet_naming_symbols.locals_symbols.applicable_kinds = local +dotnet_naming_symbols.locals_symbols.resharper_applicable_kinds = local_variable +dotnet_naming_symbols.locals_symbols.resharper_required_modifiers = any +dotnet_naming_symbols.local_constants_symbols.applicable_accessibilities = * +dotnet_naming_symbols.local_constants_symbols.applicable_kinds = local +dotnet_naming_symbols.local_constants_symbols.required_modifiers = const +dotnet_naming_symbols.local_constants_symbols.resharper_applicable_kinds = local_constant +dotnet_naming_symbols.local_constants_symbols.resharper_required_modifiers = any +dotnet_naming_symbols.local_functions_symbols.applicable_accessibilities = * +dotnet_naming_symbols.local_functions_symbols.applicable_kinds = local_function +dotnet_naming_symbols.local_functions_symbols.resharper_applicable_kinds = local_function +dotnet_naming_symbols.local_functions_symbols.resharper_required_modifiers = any +dotnet_naming_symbols.method_symbols.applicable_accessibilities = * +dotnet_naming_symbols.method_symbols.applicable_kinds = method +dotnet_naming_symbols.method_symbols.resharper_applicable_kinds = method +dotnet_naming_symbols.method_symbols.resharper_required_modifiers = any +dotnet_naming_symbols.parameters_symbols.applicable_accessibilities = * +dotnet_naming_symbols.parameters_symbols.applicable_kinds = parameter +dotnet_naming_symbols.parameters_symbols.resharper_applicable_kinds = parameter +dotnet_naming_symbols.parameters_symbols.resharper_required_modifiers = any +dotnet_naming_symbols.private_constants_symbols.applicable_accessibilities = private +dotnet_naming_symbols.private_constants_symbols.applicable_kinds = field +dotnet_naming_symbols.private_constants_symbols.required_modifiers = const +dotnet_naming_symbols.private_constants_symbols.resharper_applicable_kinds = constant_field +dotnet_naming_symbols.private_constants_symbols.resharper_required_modifiers = any +dotnet_naming_symbols.private_instance_fields_symbols.applicable_accessibilities = private +dotnet_naming_symbols.private_instance_fields_symbols.applicable_kinds = field +dotnet_naming_symbols.private_instance_fields_symbols.resharper_applicable_kinds = field,readonly_field +dotnet_naming_symbols.private_instance_fields_symbols.resharper_required_modifiers = instance +dotnet_naming_symbols.private_instance_fields_symbols_2.applicable_accessibilities = private +dotnet_naming_symbols.private_instance_fields_symbols_2.applicable_kinds = field +dotnet_naming_symbols.private_instance_fields_symbols_2.resharper_applicable_kinds = field,readonly_field +dotnet_naming_symbols.private_instance_fields_symbols_2.resharper_required_modifiers = instance +dotnet_naming_symbols.property_symbols.applicable_accessibilities = * +dotnet_naming_symbols.property_symbols.applicable_kinds = property +dotnet_naming_symbols.property_symbols.resharper_applicable_kinds = property +dotnet_naming_symbols.property_symbols.resharper_required_modifiers = any +dotnet_naming_symbols.public_fields_symbols.applicable_accessibilities = public,internal,protected,protected_internal,private_protected +dotnet_naming_symbols.public_fields_symbols.applicable_kinds = field +dotnet_naming_symbols.public_fields_symbols.resharper_applicable_kinds = field,readonly_field +dotnet_naming_symbols.public_fields_symbols.resharper_required_modifiers = instance +dotnet_naming_symbols.public_static_fields_symbols.applicable_accessibilities = public,internal,protected,protected_internal,private_protected +dotnet_naming_symbols.public_static_fields_symbols.applicable_kinds = field +dotnet_naming_symbols.public_static_fields_symbols.required_modifiers = static +dotnet_naming_symbols.public_static_fields_symbols.resharper_applicable_kinds = field +dotnet_naming_symbols.public_static_fields_symbols.resharper_required_modifiers = static +dotnet_naming_symbols.static_readonly_symbols.applicable_accessibilities = public,internal,protected,protected_internal,private_protected +dotnet_naming_symbols.static_readonly_symbols.applicable_kinds = field +dotnet_naming_symbols.static_readonly_symbols.required_modifiers = readonly,static +dotnet_naming_symbols.static_readonly_symbols.resharper_applicable_kinds = readonly_field +dotnet_naming_symbols.static_readonly_symbols.resharper_required_modifiers = static +dotnet_naming_symbols.types_and_namespaces_symbols.applicable_accessibilities = * +dotnet_naming_symbols.types_and_namespaces_symbols.applicable_kinds = class,delegate,enum,namespace,struct +dotnet_naming_symbols.types_and_namespaces_symbols.resharper_applicable_kinds = namespace,class,struct,enum,delegate +dotnet_naming_symbols.types_and_namespaces_symbols.resharper_required_modifiers = any +dotnet_naming_symbols.type_parameters_symbols.applicable_accessibilities = * +dotnet_naming_symbols.type_parameters_symbols.applicable_kinds = type_parameter +dotnet_naming_symbols.type_parameters_symbols.resharper_applicable_kinds = type_parameter +dotnet_naming_symbols.type_parameters_symbols.resharper_required_modifiers = any +dotnet_naming_symbols.unity_serialized_field_symbols.applicable_accessibilities = * +dotnet_naming_symbols.unity_serialized_field_symbols.applicable_kinds = +dotnet_naming_symbols.unity_serialized_field_symbols.resharper_applicable_kinds = unity_serialised_field +dotnet_naming_symbols.unity_serialized_field_symbols.resharper_required_modifiers = instance +dotnet_separate_import_directive_groups = false +dotnet_sort_system_directives_first = true +dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:none +dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion +dotnet_style_prefer_collection_expression = when_types_loosely_match:suggestion +dotnet_style_qualification_for_event = false:suggestion +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion +file_header_template = +fsharp_align_function_signature_to_indentation = false +fsharp_alternative_long_member_definitions = false +fsharp_indent_on_try_with = false +fsharp_keep_if_then_in_same_line = false +fsharp_max_array_or_list_width = 80 +fsharp_max_elmish_width = 40 +fsharp_max_function_binding_width = 40 +fsharp_max_if_then_else_short_width = 60 +fsharp_max_infix_operator_expression = 80 +fsharp_max_record_width = 40 +fsharp_max_value_binding_width = 80 +fsharp_multiline_block_brackets_on_same_column = false +fsharp_multi_line_lambda_closing_newline = false +fsharp_newline_between_type_definition_and_members = true +fsharp_semicolon_at_end_of_line = false +fsharp_single_argument_web_mode = false +fsharp_space_after_comma = true +fsharp_space_after_semicolon = true +fsharp_space_around_delimiter = true +fsharp_space_before_class_constructor = false +fsharp_space_before_colon = false +fsharp_space_before_lowercase_invocation = true +fsharp_space_before_member = false +fsharp_space_before_parameter = true +fsharp_space_before_semicolon = false +fsharp_space_before_uppercase_invocation = false + +# ReSharper properties +resharper_accessor_owner_body = accessors_with_expression_body +resharper_alignment_tab_fill_style = use_spaces +resharper_align_first_arg_by_paren = false +resharper_align_linq_query = false +resharper_align_multiline_array_and_object_initializer = false +resharper_align_multiline_array_initializer = true +resharper_align_multiline_binary_patterns = false +resharper_align_multiline_comments = true +resharper_align_multiline_ctor_init = true +resharper_align_multiline_expression_braces = false +resharper_align_multiline_implements_list = true +resharper_align_multiline_list_pattern = false +resharper_align_multiline_property_pattern = false +resharper_align_multiline_statement_conditions = true +resharper_align_multiline_switch_expression = false +resharper_align_multiline_type_argument = true +resharper_align_multiline_type_parameter = true +resharper_align_multiline_type_parameter_constraints = false +resharper_align_multiline_type_parameter_list = false +resharper_align_ternary = align_not_nested +resharper_align_tuple_components = false +resharper_allow_alias = true +resharper_allow_high_precedence_app_parens = true +resharper_always_use_end_of_line_brace_style = false +resharper_apply_auto_detected_rules = true +resharper_apply_on_completion = false +resharper_arguments_anonymous_function = positional +resharper_arguments_literal = positional +resharper_arguments_named = positional +resharper_arguments_other = positional +resharper_arguments_skip_single = false +resharper_arguments_string_literal = positional +resharper_attribute_style = do_not_touch +resharper_autodetect_indent_settings = false +resharper_blank_lines_after_access_specifier = 0 +resharper_blank_lines_after_block_statements = 1 +resharper_blank_lines_after_case = 0 +resharper_blank_lines_after_control_transfer_statements = 0 +resharper_blank_lines_after_file_scoped_namespace_directive = 1 +resharper_blank_lines_after_imports = 1 +resharper_blank_lines_after_multiline_statements = 0 +resharper_blank_lines_after_options = 1 +resharper_blank_lines_after_start_comment = 1 +resharper_blank_lines_after_using_list = 0 +resharper_blank_lines_around_accessor = 0 +resharper_blank_lines_around_auto_property = 1 +resharper_blank_lines_around_block_case_section = 0 +resharper_blank_lines_around_class_definition = 1 +resharper_blank_lines_around_different_module_member_kinds = 1 +resharper_blank_lines_around_field = 1 +resharper_blank_lines_around_function_declaration = 0 +resharper_blank_lines_around_function_definition = 1 +resharper_blank_lines_around_global_attribute = 0 +resharper_blank_lines_around_invocable = 1 +resharper_blank_lines_around_local_method = 1 +resharper_blank_lines_around_multiline_case_section = 0 +resharper_blank_lines_around_multiline_module_members = 1 +resharper_blank_lines_around_namespace = 1 +resharper_blank_lines_around_other_declaration = 0 +resharper_blank_lines_around_property = 1 +resharper_blank_lines_around_razor_functions = 1 +resharper_blank_lines_around_razor_helpers = 1 +resharper_blank_lines_around_razor_sections = 1 +resharper_blank_lines_around_region = 1 +resharper_blank_lines_around_single_line_accessor = 0 +resharper_blank_lines_around_single_line_auto_property = 0 +resharper_blank_lines_around_single_line_field = 0 +resharper_blank_lines_around_single_line_function_definition = 0 +resharper_blank_lines_around_single_line_invocable = 0 +resharper_blank_lines_around_single_line_local_method = 0 +resharper_blank_lines_around_single_line_module_member = 0 +resharper_blank_lines_around_single_line_property = 0 +resharper_blank_lines_around_single_line_type = 1 +resharper_blank_lines_around_type = 1 +resharper_blank_lines_before_access_specifier = 1 +resharper_blank_lines_before_block_statements = 0 +resharper_blank_lines_before_case = 0 +resharper_blank_lines_before_control_transfer_statements = 0 +resharper_blank_lines_before_first_module_member_in_nested_module = 0 +resharper_blank_lines_before_first_module_member_in_top_level_module = 1 +resharper_blank_lines_before_multiline_statements = 0 +resharper_blank_lines_before_single_line_comment = 1 +resharper_blank_lines_inside_namespace = 0 +resharper_blank_lines_inside_type = 0 +resharper_blank_line_after_pi = true +resharper_blank_line_around_top_level_modules = 2 +resharper_braces_redundant = true +resharper_break_template_declaration = line_break +resharper_builtin_type_apply_to_native_integer = false +resharper_can_use_global_alias = false +resharper_configure_await_analysis_mode = disabled +resharper_constructor_or_destructor_body = block_body +resharper_continuous_indent_multiplier = 1 +resharper_continuous_line_indent = single +resharper_cpp_align_multiline_argument = true +resharper_cpp_align_multiline_binary_expressions_chain = false +resharper_cpp_align_multiline_calls_chain = true +resharper_cpp_align_multiline_extends_list = true +resharper_cpp_align_multiline_for_stmt = true +resharper_cpp_align_multiline_parameter = true +resharper_cpp_align_multiple_declaration = true +resharper_cpp_allow_comment_after_lbrace = false +resharper_cpp_allow_far_alignment = false +resharper_cpp_anonymous_method_declaration_braces = next_line +resharper_cpp_case_block_braces = next_line_shifted_2 +resharper_cpp_empty_block_style = multiline +resharper_cpp_indent_switch_labels = false +resharper_cpp_insert_final_newline = true +resharper_cpp_invocable_declaration_braces = next_line +resharper_cpp_keep_blank_lines_in_declarations = 2 +resharper_cpp_keep_existing_arrangement = true +resharper_cpp_new_line_before_catch = true +resharper_cpp_new_line_before_else = true +resharper_cpp_new_line_before_while = true +resharper_cpp_other_braces = next_line +resharper_cpp_place_simple_blocks_on_single_line = false +resharper_cpp_space_after_unary_operator = false +resharper_cpp_space_around_binary_operator = true +resharper_cpp_type_declaration_braces = next_line +resharper_cpp_wrap_lines = true +resharper_csharp_align_multiline_argument = false +resharper_csharp_align_multiline_binary_expressions_chain = true +resharper_csharp_align_multiline_calls_chain = false +resharper_csharp_align_multiline_expression = false +resharper_csharp_align_multiline_extends_list = false +resharper_csharp_align_multiline_for_stmt = false +resharper_csharp_align_multiline_parameter = false +resharper_csharp_align_multiple_declaration = false +resharper_csharp_allow_comment_after_lbrace = true +resharper_csharp_allow_far_alignment = false +resharper_csharp_blank_lines_inside_region = 0 +resharper_csharp_empty_block_style = together_same_line +resharper_csharp_insert_final_newline = true +resharper_csharp_keep_blank_lines_in_declarations = 1 +resharper_csharp_keep_existing_enum_arrangement = false +resharper_csharp_keep_nontrivial_alias = false +resharper_csharp_new_line_before_while = false +resharper_csharp_prefer_qualified_reference = false +resharper_csharp_space_after_unary_operator = false +resharper_csharp_wrap_before_binary_opsign = true +resharper_csharp_wrap_lines = false +resharper_cxxcli_property_declaration_braces = next_line +resharper_declaration_body_on_the_same_line = if_owner_is_single_line +resharper_default_exception_variable_name = e +resharper_default_value_when_type_evident = default_literal +resharper_default_value_when_type_not_evident = default_literal +resharper_delete_quotes_from_solid_values = false +resharper_disable_blank_line_changes = false +resharper_disable_formatter = false +resharper_disable_indenter = false +resharper_disable_int_align = false +resharper_disable_line_break_changes = false +resharper_disable_line_break_removal = false +resharper_disable_space_changes = false +resharper_disable_space_changes_before_trailing_comment = false +resharper_dont_remove_extra_blank_lines = false +resharper_enable_slate_format = true +resharper_enable_wrapping = false +resharper_enforce_line_ending_style = false +resharper_event_handler_pattern_long = $object$On$event$ +resharper_event_handler_pattern_short = On$event$ +resharper_export_declaration_braces = next_line +resharper_expression_braces = inside +resharper_expression_pars = inside +resharper_extra_spaces = remove_all +resharper_force_attribute_style = separate +resharper_force_chop_compound_do_expression = false +resharper_force_chop_compound_if_expression = false +resharper_force_chop_compound_while_expression = false +resharper_formatter_off_tag = @formatter:off +resharper_formatter_on_tag = @formatter:on +resharper_formatter_tags_accept_regexp = false +resharper_formatter_tags_enabled = true +resharper_format_leading_spaces_decl = false +resharper_free_block_braces = next_line +resharper_fsharp_allow_far_alignment = true +resharper_fsharp_empty_block_style = together_same_line +resharper_fsharp_insert_final_newline = false +resharper_fsharp_type_declaration_braces = pico +resharper_fsharp_wrap_lines = true +resharper_function_declaration_return_type_style = do_not_change +resharper_function_definition_return_type_style = do_not_change +resharper_generator_mode = false +resharper_html_allow_far_alignment = false +resharper_html_attribute_indent = align_by_first_attribute +resharper_html_insert_final_newline = false +resharper_html_linebreak_before_elements = body,div,p,form,h1,h2,h3 +resharper_html_max_blank_lines_between_tags = 2 +resharper_html_pi_attribute_style = on_single_line +resharper_html_space_before_self_closing = false +resharper_html_wrap_lines = true +resharper_ignore_space_preservation = false +resharper_include_prefix_comment_in_indent = false +resharper_indent_access_specifiers_from_class = false +resharper_indent_aligned_ternary = true +resharper_indent_anonymous_method_block = false +resharper_indent_braces_inside_statement_conditions = true +resharper_indent_break_from_case = true +resharper_indent_case_from_select = true +resharper_indent_child_elements = OneIndent +resharper_indent_class_members_from_access_specifiers = false +resharper_indent_comment = true +resharper_indent_declaration_after_ufunction_and_uproperty = false +resharper_indent_export_declaration_members = true +resharper_indent_goto_labels = true +resharper_indent_inside_namespace = true +resharper_indent_invocation_pars = inside +resharper_indent_member_initializer_list = true +resharper_indent_method_decl_pars = inside +resharper_indent_nested_fixed_stmt = false +resharper_indent_nested_foreach_stmt = false +resharper_indent_nested_for_stmt = false +resharper_indent_nested_lock_stmt = false +resharper_indent_nested_usings_stmt = false +resharper_indent_nested_while_stmt = false +resharper_indent_pars = inside +resharper_indent_preprocessor_directives = normal +resharper_indent_preprocessor_if = no_indent +resharper_indent_preprocessor_other = no_indent +resharper_indent_preprocessor_region = usual_indent +resharper_indent_primary_constructor_decl_pars = inside +resharper_indent_raw_literal_string = align +resharper_indent_statement_pars = inside +resharper_indent_text = OneIndent +resharper_indent_typearg_angles = inside +resharper_indent_typeparam_angles = inside +resharper_indent_type_constraints = true +resharper_indent_wrapped_function_names = false +resharper_instance_members_qualify_declared_in = this_class, base_class +resharper_int_align = false +resharper_int_align_bitfield_sizes = false +resharper_int_align_comments = false +resharper_int_align_declaration_names = false +resharper_int_align_designated_initializers = false +resharper_int_align_enum_initializers = false +resharper_int_align_eq = false +resharper_int_align_fix_in_adjacent = true +resharper_keep_blank_lines_in_code = 2 +resharper_keep_existing_attribute_arrangement = false +resharper_keep_existing_declaration_block_arrangement = false +resharper_keep_existing_declaration_parens_arrangement = true +resharper_keep_existing_embedded_arrangement = true +resharper_keep_existing_embedded_block_arrangement = false +resharper_keep_existing_expr_member_arrangement = true +resharper_keep_existing_invocation_parens_arrangement = true +resharper_keep_existing_line_break_before_declaration_body = true +resharper_keep_existing_list_patterns_arrangement = true +resharper_keep_existing_primary_constructor_declaration_parens_arrangement = true +resharper_keep_existing_property_patterns_arrangement = true +resharper_keep_existing_switch_expression_arrangement = true +resharper_keep_max_blank_line_around_module_members = 2 +resharper_keep_user_linebreaks = true +resharper_keep_user_wrapping = true +resharper_labeled_statement_style = line_break +resharper_linebreaks_around_razor_statements = true +resharper_linebreaks_inside_tags_for_elements_longer_than = 2147483647 +resharper_linebreaks_inside_tags_for_elements_with_child_elements = true +resharper_linebreaks_inside_tags_for_multiline_elements = true +resharper_linebreak_before_all_elements = false +resharper_linebreak_before_multiline_elements = true +resharper_linebreak_before_singleline_elements = false +resharper_line_break_after_colon_in_member_initializer_lists = do_not_change +resharper_line_break_after_comma_in_member_initializer_lists = false +resharper_line_break_after_deref_in_trailing_return_types = do_not_change +resharper_line_break_after_init_statement = do_not_change +resharper_line_break_after_type_repr_access_modifier = true +resharper_line_break_before_comma_in_member_initializer_lists = false +resharper_line_break_before_deref_in_trailing_return_types = do_not_change +resharper_line_break_before_function_try_block = do_not_change +resharper_line_break_before_requires_clause = do_not_change +resharper_linkage_specification_braces = end_of_line +resharper_linkage_specification_indentation = none +resharper_local_function_body = expression_body +resharper_macro_block_begin = +resharper_macro_block_end = +resharper_max_array_initializer_elements_on_line = 100 +resharper_max_attribute_length_for_same_line = 38 +resharper_max_enum_members_on_line = 3 +resharper_max_formal_parameters_on_line = 10000 +resharper_max_initializer_elements_on_line = 10 +resharper_max_invocation_arguments_on_line = 10000 +resharper_max_primary_constructor_parameters_on_line = 10000 +resharper_member_initializer_list_style = do_not_change +resharper_method_or_operator_body = expression_body +resharper_namespace_declaration_braces = next_line +resharper_namespace_indentation = all +resharper_nested_ternary_style = autodetect +resharper_never_outdent_pipe_operators = true +resharper_new_line_before_enumerators = true +resharper_normalize_tag_names = false +resharper_no_indent_inside_elements = html,body,thead,tbody,tfoot +resharper_no_indent_inside_if_element_longer_than = 200 +resharper_null_checking_pattern_style = not_null_pattern +resharper_object_creation_when_type_evident = target_typed +resharper_object_creation_when_type_not_evident = explicitly_typed +resharper_old_engine = false +resharper_outdent_binary_operators = true +resharper_outdent_binary_ops = false +resharper_outdent_binary_pattern_ops = false +resharper_outdent_commas = false +resharper_outdent_dots = false +resharper_outdent_namespace_member = false +resharper_outdent_statement_labels = false +resharper_outdent_ternary_ops = false +resharper_parentheses_non_obvious_operations = none, shift, bitwise_and, bitwise_exclusive_or, bitwise_inclusive_or, bitwise +resharper_parentheses_redundancy_style = remove_if_not_clarifies_precedence +resharper_parentheses_same_type_operations = false +resharper_pi_attributes_indent = align_by_first_attribute +resharper_place_accessorholder_attribute_on_same_line = false +resharper_place_accessor_attribute_on_same_line = false +resharper_place_comments_at_first_column = false +resharper_place_constructor_initializer_on_same_line = true +resharper_place_event_attribute_on_same_line = false +resharper_place_expr_accessor_on_single_line = if_owner_is_single_line +resharper_place_expr_method_on_single_line = if_owner_is_single_line +resharper_place_expr_property_on_single_line = if_owner_is_single_line +resharper_place_field_attribute_on_same_line = false +resharper_place_linq_into_on_new_line = false +resharper_place_method_attribute_on_same_line = false +resharper_place_namespace_definitions_on_same_line = false +resharper_place_primary_constructor_initializer_on_same_line = true +resharper_place_property_attribute_on_same_line = false +resharper_place_record_field_attribute_on_same_line = if_owner_is_single_line +resharper_place_simple_case_statement_on_same_line = false +resharper_place_simple_embedded_statement_on_same_line = if_owner_is_single_line +resharper_place_simple_initializer_on_single_line = true +resharper_place_simple_list_pattern_on_single_line = true +resharper_place_simple_property_pattern_on_single_line = true +resharper_place_simple_switch_expression_on_single_line = false +resharper_place_single_method_argument_lambda_on_same_line = true +resharper_place_type_attribute_on_same_line = false +resharper_place_type_constraints_on_same_line = true +resharper_prefer_explicit_discard_declaration = false +resharper_prefer_line_break_after_multiline_lparen = true +resharper_prefer_roslyn_rules_for_parentheses_clarity = false +resharper_prefer_separate_deconstructed_variables_declaration = false +resharper_prefer_wrap_around_eq = default +resharper_preserve_spaces_inside_tags = pre,textarea +resharper_qualified_using_at_nested_scope = false +resharper_quote_style = doublequoted +resharper_razor_prefer_qualified_reference = true +resharper_remove_blank_lines_near_braces = false +resharper_remove_blank_lines_near_braces_in_code = true +resharper_remove_blank_lines_near_braces_in_declarations = true +resharper_remove_only_unused_aliases = true +resharper_remove_spaces_on_blank_lines = true +resharper_remove_this_qualifier = true +resharper_remove_unused_only_aliases = false +resharper_requires_expression_braces = next_line +resharper_resx_allow_far_alignment = false +resharper_resx_attribute_indent = single_indent +resharper_resx_insert_final_newline = false +resharper_resx_linebreak_before_elements = +resharper_resx_max_blank_lines_between_tags = 0 +resharper_resx_pi_attribute_style = do_not_touch +resharper_resx_space_before_self_closing = false +resharper_resx_wrap_lines = false +resharper_resx_wrap_tags_and_pi = false +resharper_resx_wrap_text = false +resharper_shaderlab_allow_far_alignment = false +resharper_shaderlab_brace_style = next_line +resharper_shaderlab_insert_final_newline = false +resharper_shaderlab_wrap_lines = true +resharper_show_autodetect_configure_formatting_tip = false +resharper_simple_block_style = do_not_change +resharper_simple_case_statement_style = do_not_change +resharper_simple_embedded_statement_style = do_not_change +resharper_slate_brackets_indent = inside +resharper_slate_brackets_wrap = chop_always +resharper_slate_wrap_before_bracket = true +resharper_slate_wrap_chained_binary_expression = chop_if_long +resharper_slate_wrap_chained_member_access = chop_if_long +resharper_sort_attributes = false +resharper_sort_class_selectors = false +resharper_sort_usings = true +resharper_spaces_around_eq_in_attribute = false +resharper_spaces_around_eq_in_pi_attribute = false +resharper_spaces_inside_tags = false +resharper_space_after_attributes = true +resharper_space_after_attribute_target_colon = true +resharper_space_after_cast = false +resharper_space_after_colon = true +resharper_space_after_colon_in_bitfield_declarator = true +resharper_space_after_colon_in_case = true +resharper_space_after_colon_in_inheritance_clause = true +resharper_space_after_comma = true +resharper_space_after_ellipsis_in_parameter_pack = true +resharper_space_after_for_colon = true +resharper_space_after_keywords_in_control_flow_statements = true +resharper_space_after_last_attribute = false +resharper_space_after_last_pi_attribute = false +resharper_space_after_operator_keyword = true +resharper_space_after_operator_not = false +resharper_space_after_ptr_in_data_member = true +resharper_space_after_ptr_in_data_members = false +resharper_space_after_ptr_in_method = true +resharper_space_after_ptr_in_nested_declarator = false +resharper_space_after_ref_in_data_member = true +resharper_space_after_ref_in_data_members = false +resharper_space_after_ref_in_method = true +resharper_space_after_semicolon_in_for_statement = true +resharper_space_after_slate_operator = true +resharper_space_after_ternary_colon = true +resharper_space_after_ternary_quest = true +resharper_space_after_triple_slash = true +resharper_space_after_type_parameter_constraint_colon = true +resharper_space_around_additive_op = true +resharper_space_around_alias_eq = true +resharper_space_around_assignment_op = true +resharper_space_around_assignment_operator = true +resharper_space_around_deref_in_trailing_return_type = true +resharper_space_around_lambda_arrow = true +resharper_space_around_member_access_operator = false +resharper_space_around_relational_op = true +resharper_space_around_shift_op = true +resharper_space_around_stmt_colon = true +resharper_space_around_ternary_operator = true +resharper_space_before_array_rank_parentheses = false +resharper_space_before_attribute_target_colon = false +resharper_space_before_checked_parentheses = false +resharper_space_before_colon = false +resharper_space_before_colon_in_bitfield_declarator = true +resharper_space_before_colon_in_case = false +resharper_space_before_colon_in_ctor_initializer = true +resharper_space_before_colon_in_inheritance_clause = true +resharper_space_before_comma = false +resharper_space_before_default_parentheses = false +resharper_space_before_ellipsis_in_parameter_pack = false +resharper_space_before_empty_invocation_parentheses = false +resharper_space_before_empty_method_parentheses = false +resharper_space_before_for_colon = true +resharper_space_before_initializer_braces = false +resharper_space_before_invocation_parentheses = false +resharper_space_before_label_colon = false +resharper_space_before_lambda_parentheses = false +resharper_space_before_method_parentheses = false +resharper_space_before_nameof_parentheses = false +resharper_space_before_new_parentheses = false +resharper_space_before_nullable_mark = false +resharper_space_before_open_square_brackets = false +resharper_space_before_pointer_asterik_declaration = false +resharper_space_before_postfix_operator = false +resharper_space_before_ptr_in_abstract_decl = false +resharper_space_before_ptr_in_data_member = false +resharper_space_before_ptr_in_data_members = true +resharper_space_before_ptr_in_method = false +resharper_space_before_ref_in_abstract_decl = false +resharper_space_before_ref_in_data_member = false +resharper_space_before_ref_in_data_members = true +resharper_space_before_ref_in_method = false +resharper_space_before_semicolon = false +resharper_space_before_semicolon_in_for_statement = false +resharper_space_before_singleline_accessorholder = true +resharper_space_before_sizeof_parentheses = false +resharper_space_before_template_args = false +resharper_space_before_template_params = true +resharper_space_before_ternary_colon = true +resharper_space_before_ternary_quest = true +resharper_space_before_trailing_comment = true +resharper_space_before_trailing_comment_text = false +resharper_space_before_typeof_parentheses = false +resharper_space_before_type_argument_angle = false +resharper_space_before_type_parameter_angle = false +resharper_space_before_type_parameter_constraint_colon = true +resharper_space_before_type_parameter_parentheses = true +resharper_space_between_accessors_in_singleline_property = true +resharper_space_between_attribute_sections = true +resharper_space_between_closing_angle_brackets_in_template_args = false +resharper_space_between_keyword_and_expression = true +resharper_space_between_keyword_and_type = true +resharper_space_between_method_call_empty_parameter_list_parentheses = false +resharper_space_between_method_call_name_and_opening_parenthesis = false +resharper_space_between_method_call_parameter_list_parentheses = false +resharper_space_between_method_declaration_empty_parameter_list_parentheses = false +resharper_space_between_method_declaration_name_and_open_parenthesis = false +resharper_space_between_method_declaration_parameter_list_parentheses = false +resharper_space_between_parentheses_of_control_flow_statements = false +resharper_space_between_square_brackets = false +resharper_space_between_typecast_parentheses = false +resharper_space_in_singleline_accessorholder = true +resharper_space_in_singleline_anonymous_method = true +resharper_space_in_singleline_method = true +resharper_space_near_postfix_and_prefix_op = false +resharper_space_within_array_initialization_braces = false +resharper_space_within_array_rank_empty_parentheses = false +resharper_space_within_array_rank_parentheses = false +resharper_space_within_attribute_angles = false +resharper_space_within_checked_parentheses = false +resharper_space_within_declaration_parentheses = false +resharper_space_within_default_parentheses = false +resharper_space_within_empty_blocks = false +resharper_space_within_empty_braces = true +resharper_space_within_empty_initializer_braces = false +resharper_space_within_empty_invocation_parentheses = false +resharper_space_within_empty_method_parentheses = false +resharper_space_within_empty_template_params = false +resharper_space_within_expression_parentheses = false +resharper_space_within_initializer_braces = false +resharper_space_within_invocation_parentheses = false +resharper_space_within_method_parentheses = false +resharper_space_within_nameof_parentheses = false +resharper_space_within_new_parentheses = false +resharper_space_within_parentheses = false +resharper_space_within_single_line_array_initializer_braces = true +resharper_space_within_sizeof_parentheses = false +resharper_space_within_slice_pattern = true +resharper_space_within_template_args = false +resharper_space_within_template_params = false +resharper_space_within_tuple_parentheses = false +resharper_space_within_typeof_parentheses = false +resharper_space_within_type_argument_angles = false +resharper_space_within_type_parameter_angles = false +resharper_space_within_type_parameter_parentheses = false +resharper_special_else_if_treatment = true +resharper_static_members_qualify_members = none +resharper_static_members_qualify_with = declared_type +resharper_stick_comment = true +resharper_support_vs_event_naming_pattern = true +resharper_T4_allow_far_alignment = false +resharper_T4_insert_final_newline = false +resharper_T4_wrap_lines = true +resharper_toplevel_function_declaration_return_type_style = do_not_change +resharper_toplevel_function_definition_return_type_style = do_not_change +resharper_trailing_comma_in_multiline_lists = false +resharper_trailing_comma_in_singleline_lists = false +resharper_treat_case_statement_with_break_as_simple = true +resharper_use_continuous_indent_inside_initializer_braces = true +resharper_use_continuous_indent_inside_parens = true +resharper_use_continuous_line_indent_in_expression_braces = false +resharper_use_continuous_line_indent_in_method_pars = false +resharper_use_heuristics_for_body_style = true +resharper_use_indents_from_main_language_in_file = true +resharper_use_indent_from_previous_element = true +resharper_use_indent_from_vs = false +resharper_use_old_engine = false +resharper_use_roslyn_logic_for_evident_types = true +resharper_vb_align_multiline_argument = true +resharper_vb_align_multiline_expression = true +resharper_vb_align_multiline_parameter = true +resharper_vb_align_multiple_declaration = true +resharper_vb_allow_far_alignment = false +resharper_vb_blank_lines_inside_region = 1 +resharper_vb_insert_final_newline = false +resharper_vb_keep_blank_lines_in_declarations = 2 +resharper_vb_keep_nontrivial_alias = true +resharper_vb_place_field_attribute_on_same_line = true +resharper_vb_place_method_attribute_on_same_line = false +resharper_vb_place_type_attribute_on_same_line = false +resharper_vb_prefer_qualified_reference = false +resharper_vb_space_after_unary_operator = true +resharper_vb_space_around_multiplicative_op = false +resharper_vb_wrap_before_binary_opsign = false +resharper_vb_wrap_lines = true +resharper_wrap_after_binary_opsign = true +resharper_wrap_after_declaration_lpar = false +resharper_wrap_after_dot = false +resharper_wrap_after_dot_in_method_calls = false +resharper_wrap_after_expression_lbrace = true +resharper_wrap_after_invocation_lpar = false +resharper_wrap_after_primary_constructor_declaration_lpar = true +resharper_wrap_after_property_in_chained_method_calls = false +resharper_wrap_arguments = wrap_if_long +resharper_wrap_arguments_style = wrap_if_long +resharper_wrap_around_elements = true +resharper_wrap_array_initializer_style = wrap_if_long +resharper_wrap_base_clause_style = wrap_if_long +resharper_wrap_before_arrow_with_expressions = false +resharper_wrap_before_binary_pattern_op = true +resharper_wrap_before_colon = false +resharper_wrap_before_comma = false +resharper_wrap_before_comma_in_base_clause = false +resharper_wrap_before_declaration_lpar = false +resharper_wrap_before_declaration_rpar = false +resharper_wrap_before_eq = true +resharper_wrap_before_expression_rbrace = true +resharper_wrap_before_extends_colon = false +resharper_wrap_before_first_method_call = false +resharper_wrap_before_first_type_parameter_constraint = false +resharper_wrap_before_invocation_lpar = false +resharper_wrap_before_invocation_rpar = false +resharper_wrap_before_linq_expression = true +resharper_wrap_before_primary_constructor_declaration_lpar = false +resharper_wrap_before_primary_constructor_declaration_rpar = false +resharper_wrap_before_ternary_opsigns = true +resharper_wrap_before_type_parameter_langle = false +resharper_wrap_braced_init_list_style = wrap_if_long +resharper_wrap_chained_binary_expressions = chop_if_long +resharper_wrap_chained_binary_patterns = wrap_if_long +resharper_wrap_chained_method_calls = chop_if_long +resharper_wrap_comments = false +resharper_wrap_ctor_initializer_style = wrap_if_long +resharper_wrap_enumeration_style = chop_if_long +resharper_wrap_enum_declaration = chop_always +resharper_wrap_extends_list_style = wrap_if_long +resharper_wrap_for_stmt_header_style = chop_if_long +resharper_wrap_list_pattern = wrap_if_long +resharper_wrap_multiple_declaration_style = chop_if_long +resharper_wrap_multiple_type_parameter_constraints_style = chop_if_long +resharper_wrap_object_and_collection_initializer_style = chop_if_long +resharper_wrap_parameters_style = wrap_if_long +resharper_wrap_primary_constructor_parameters_style = chop_if_long +resharper_wrap_property_pattern = chop_if_long +resharper_wrap_switch_expression = chop_always +resharper_wrap_ternary_expr_style = chop_if_long +resharper_wrap_verbatim_interpolated_strings = no_wrap +resharper_xmldoc_allow_far_alignment = false +resharper_xmldoc_attribute_indent = single_indent +resharper_xmldoc_insert_final_newline = false +resharper_xmldoc_linebreak_before_elements = summary,remarks,example,returns,param,typeparam,value,para +resharper_xmldoc_max_blank_lines_between_tags = 0 +resharper_xmldoc_pi_attribute_style = do_not_touch +resharper_xmldoc_space_before_self_closing = true +resharper_xmldoc_wrap_lines = false +resharper_xmldoc_wrap_tags_and_pi = true +resharper_xmldoc_wrap_text = true +resharper_xml_allow_far_alignment = false +resharper_xml_attribute_indent = align_by_first_attribute +resharper_xml_insert_final_newline = false +resharper_xml_linebreak_before_elements = +resharper_xml_max_blank_lines_between_tags = 2 +resharper_xml_pi_attribute_style = do_not_touch +resharper_xml_space_before_self_closing = true +resharper_xml_wrap_lines = true +resharper_xml_wrap_tags_and_pi = true +resharper_xml_wrap_text = false + +# ReSharper inspection severities +resharper_access_rights_in_text_highlighting = warning +resharper_access_to_disposed_closure_highlighting = warning +resharper_access_to_for_each_variable_in_closure_highlighting = warning +resharper_access_to_modified_closure_highlighting = warning +resharper_access_to_static_member_via_derived_type_highlighting = warning +resharper_address_of_marshal_by_ref_object_highlighting = warning +resharper_all_underscore_local_parameter_name_highlighting = warning +resharper_angular_html_banana_highlighting = warning +resharper_annotate_can_be_null_parameter_highlighting = none +resharper_annotate_can_be_null_type_member_highlighting = none +resharper_annotate_not_null_parameter_highlighting = none +resharper_annotate_not_null_type_member_highlighting = none +resharper_annotation_conflict_in_hierarchy_highlighting = warning +resharper_annotation_redundancy_at_value_type_highlighting = warning +resharper_annotation_redundancy_in_hierarchy_highlighting = warning +resharper_append_to_collection_expression_highlighting = suggestion +resharper_arguments_style_anonymous_function_highlighting = hint +resharper_arguments_style_literal_highlighting = hint +resharper_arguments_style_named_expression_highlighting = hint +resharper_arguments_style_other_highlighting = hint +resharper_arguments_style_string_literal_highlighting = hint +resharper_arrange_accessor_owner_body_highlighting = suggestion +resharper_arrange_attributes_highlighting = none +resharper_arrange_constructor_or_destructor_body_highlighting = suggestion +resharper_arrange_default_value_when_type_evident_highlighting = suggestion +resharper_arrange_default_value_when_type_not_evident_highlighting = hint +resharper_arrange_local_function_body_highlighting = suggestion +resharper_arrange_method_or_operator_body_highlighting = suggestion +resharper_arrange_null_checking_pattern_highlighting = hint +resharper_arrange_object_creation_when_type_evident_highlighting = suggestion +resharper_arrange_object_creation_when_type_not_evident_highlighting = hint +resharper_arrange_redundant_parentheses_highlighting = hint +resharper_arrange_static_member_qualifier_highlighting = hint +resharper_arrange_this_qualifier_highlighting = hint +resharper_arrange_trailing_comma_in_multiline_lists_highlighting = hint +resharper_arrange_trailing_comma_in_singleline_lists_highlighting = hint +resharper_arrange_type_member_modifiers_highlighting = hint +resharper_arrange_type_modifiers_highlighting = hint +resharper_arrange_var_keywords_in_deconstructing_declaration_highlighting = suggestion +resharper_asp_content_placeholder_not_resolved_highlighting = error +resharper_asp_custom_page_parser_filter_type_highlighting = warning +resharper_asp_dead_code_highlighting = warning +resharper_asp_entity_highlighting = warning +resharper_asp_image_highlighting = warning +resharper_asp_invalid_control_type_highlighting = error +resharper_asp_not_resolved_highlighting = error +resharper_asp_ods_method_reference_resolve_error_highlighting = error +resharper_asp_resolve_warning_highlighting = warning +resharper_asp_skin_not_resolved_highlighting = error +resharper_asp_tag_attribute_with_optional_value_highlighting = warning +resharper_asp_theme_not_resolved_highlighting = error +resharper_asp_unused_register_directive_highlighting_highlighting = warning +resharper_asp_warning_highlighting = warning +resharper_assignment_instead_of_discard_highlighting = warning +resharper_assignment_in_conditional_expression_highlighting = warning +resharper_assignment_is_fully_discarded_highlighting = warning +resharper_assign_null_to_not_null_attribute_highlighting = warning +resharper_asxx_path_error_highlighting = warning +resharper_async_iterator_invocation_without_await_foreach_highlighting = warning +resharper_async_void_event_handler_method_highlighting = suggestion +resharper_async_void_lambda_highlighting = warning +resharper_async_void_method_highlighting = suggestion +resharper_async_void_throw_exception_highlighting = suggestion +resharper_auto_property_can_be_made_get_only_global_highlighting = suggestion +resharper_auto_property_can_be_made_get_only_local_highlighting = suggestion +resharper_bad_attribute_brackets_spaces_highlighting = none +resharper_bad_braces_spaces_highlighting = none +resharper_bad_child_statement_indent_highlighting = warning +resharper_bad_colon_spaces_highlighting = none +resharper_bad_comma_spaces_highlighting = none +resharper_bad_control_braces_indent_highlighting = suggestion +resharper_bad_control_braces_line_breaks_highlighting = none +resharper_bad_declaration_braces_indent_highlighting = none +resharper_bad_declaration_braces_line_breaks_highlighting = none +resharper_bad_empty_braces_line_breaks_highlighting = none +resharper_bad_expression_braces_indent_highlighting = none +resharper_bad_expression_braces_line_breaks_highlighting = none +resharper_bad_generic_brackets_spaces_highlighting = none +resharper_bad_indent_highlighting = none +resharper_bad_linq_line_breaks_highlighting = none +resharper_bad_list_line_breaks_highlighting = none +resharper_bad_member_access_spaces_highlighting = none +resharper_bad_namespace_braces_indent_highlighting = none +resharper_bad_parens_line_breaks_highlighting = none +resharper_bad_parens_spaces_highlighting = none +resharper_bad_preprocessor_indent_highlighting = none +resharper_bad_semicolon_spaces_highlighting = none +resharper_bad_spaces_after_keyword_highlighting = none +resharper_bad_square_brackets_spaces_highlighting = none +resharper_bad_switch_braces_indent_highlighting = none +resharper_bad_symbol_spaces_highlighting = none +resharper_base_member_has_params_highlighting = warning +resharper_base_method_call_with_default_parameter_highlighting = warning +resharper_base_object_equals_is_object_equals_highlighting = warning +resharper_base_object_get_hash_code_call_in_get_hash_code_highlighting = warning +resharper_bitwise_operator_on_enum_without_flags_highlighting = warning +resharper_blazor_editor_required_highlighting = warning +resharper_both_context_call_declaration_global_highlighting = warning +resharper_both_context_call_usage_global_highlighting = warning +resharper_built_in_type_reference_style_for_member_access_highlighting = hint +resharper_built_in_type_reference_style_highlighting = hint +resharper_by_ref_argument_is_volatile_field_highlighting = warning +resharper_cannot_apply_equality_operator_to_type_highlighting = warning +resharper_can_replace_cast_with_lambda_return_type_highlighting = hint +resharper_can_replace_cast_with_shorter_type_argument_highlighting = suggestion +resharper_can_replace_cast_with_type_argument_highlighting = hint +resharper_can_replace_cast_with_variable_type_highlighting = hint +resharper_can_simplify_dictionary_lookup_with_try_add_highlighting = suggestion +resharper_can_simplify_dictionary_lookup_with_try_get_value_highlighting = suggestion +resharper_can_simplify_dictionary_removing_with_single_call_highlighting = suggestion +resharper_can_simplify_dictionary_try_get_value_with_get_value_or_default_highlighting = suggestion +resharper_can_simplify_is_assignable_from_highlighting = suggestion +resharper_can_simplify_is_instance_of_type_highlighting = suggestion +resharper_can_simplify_set_adding_with_single_call_highlighting = suggestion +resharper_can_simplify_string_escape_sequence_highlighting = hint +resharper_captured_primary_constructor_parameter_is_mutable_highlighting = warning +resharper_center_tag_is_obsolete_highlighting = warning +resharper_change_field_type_to_system_threading_lock_highlighting = suggestion +resharper_check_for_reference_equality_instead_1_highlighting = suggestion +resharper_check_for_reference_equality_instead_2_highlighting = suggestion +resharper_check_for_reference_equality_instead_3_highlighting = suggestion +resharper_check_for_reference_equality_instead_4_highlighting = suggestion +resharper_check_namespace_highlighting = none +resharper_class_cannot_be_instantiated_highlighting = warning +resharper_class_can_be_sealed_global_highlighting = none +resharper_class_can_be_sealed_local_highlighting = none +resharper_class_never_instantiated_global_highlighting = suggestion +resharper_class_never_instantiated_local_highlighting = suggestion +resharper_class_with_virtual_members_never_inherited_global_highlighting = suggestion +resharper_class_with_virtual_members_never_inherited_local_highlighting = suggestion +resharper_clear_attribute_is_obsolete_all_highlighting = warning +resharper_clear_attribute_is_obsolete_highlighting = warning +resharper_collection_never_queried_global_highlighting = warning +resharper_collection_never_queried_local_highlighting = warning +resharper_collection_never_updated_global_highlighting = warning +resharper_collection_never_updated_local_highlighting = warning +resharper_command_invasion_declaration_global_highlighting = warning +resharper_command_invasion_usage_global_highlighting = warning +resharper_compare_non_constrained_generic_with_null_highlighting = none +resharper_compare_of_floats_by_equality_operator_highlighting = warning +resharper_conditional_access_qualifier_is_non_nullable_according_to_api_contract_highlighting = warning +resharper_conditional_ternary_equal_branch_highlighting = warning +resharper_condition_is_always_true_or_false_according_to_nullable_api_contract_highlighting = warning +resharper_condition_is_always_true_or_false_highlighting = warning +resharper_conflict_cqrs_attribute_highlighting = warning +resharper_confusing_char_as_integer_in_constructor_highlighting = warning +resharper_constant_conditional_access_qualifier_highlighting = warning +resharper_constant_expected_highlighting = suggestion +resharper_constant_null_coalescing_condition_highlighting = warning +resharper_consteval_if_is_always_constant_highlighting = warning +resharper_constructor_initializer_loop_highlighting = warning +resharper_constructor_with_must_dispose_resource_attribute_base_is_not_annotated_highlighting = warning +resharper_container_annotation_redundancy_highlighting = warning +resharper_context_value_is_provided_highlighting = none +resharper_contract_annotation_not_parsed_highlighting = warning +resharper_convert_closure_to_method_group_highlighting = suggestion +resharper_convert_conditional_ternary_expression_to_switch_expression_highlighting = hint +resharper_convert_constructor_to_member_initializers_highlighting = suggestion +resharper_convert_if_do_to_while_highlighting = suggestion +resharper_convert_if_statement_to_conditional_ternary_expression_highlighting = suggestion +resharper_convert_if_statement_to_null_coalescing_assignment_highlighting = suggestion +resharper_convert_if_statement_to_null_coalescing_expression_highlighting = suggestion +resharper_convert_if_statement_to_return_statement_highlighting = hint +resharper_convert_if_statement_to_switch_statement_highlighting = hint +resharper_convert_if_to_or_expression_highlighting = suggestion +resharper_convert_nullable_to_short_form_highlighting = suggestion +resharper_convert_switch_statement_to_switch_expression_highlighting = hint +resharper_convert_to_auto_property_highlighting = suggestion +resharper_convert_to_auto_property_when_possible_highlighting = hint +resharper_convert_to_auto_property_with_private_setter_highlighting = hint +resharper_convert_to_compound_assignment_highlighting = hint +resharper_convert_to_constant_global_highlighting = hint +resharper_convert_to_constant_local_highlighting = hint +resharper_convert_to_extension_block_highlighting = suggestion +resharper_convert_to_lambda_expression_highlighting = suggestion +resharper_convert_to_local_function_highlighting = suggestion +resharper_convert_to_null_coalescing_compound_assignment_highlighting = suggestion +resharper_convert_to_primary_constructor_highlighting = suggestion +resharper_convert_to_static_class_highlighting = suggestion +resharper_convert_to_using_declaration_highlighting = suggestion +resharper_convert_to_vb_auto_property_highlighting = suggestion +resharper_convert_to_vb_auto_property_when_possible_highlighting = hint +resharper_convert_to_vb_auto_property_with_private_setter_highlighting = hint +resharper_convert_type_check_pattern_to_null_check_highlighting = warning +resharper_convert_type_check_to_null_check_highlighting = warning +resharper_co_variant_array_conversion_highlighting = warning +resharper_cpp_abstract_class_without_specifier_highlighting = warning +resharper_cpp_abstract_final_class_highlighting = warning +resharper_cpp_abstract_virtual_function_call_in_ctor_highlighting = error +resharper_cpp_access_specifier_with_no_declarations_highlighting = suggestion +resharper_cpp_assigned_value_is_never_used_highlighting = warning +resharper_cpp_awaiter_type_is_not_class_highlighting = warning +resharper_cpp_bad_angle_brackets_spaces_highlighting = none +resharper_cpp_bad_braces_spaces_highlighting = none +resharper_cpp_bad_child_statement_indent_highlighting = none +resharper_cpp_bad_colon_spaces_highlighting = none +resharper_cpp_bad_comma_spaces_highlighting = none +resharper_cpp_bad_control_braces_indent_highlighting = none +resharper_cpp_bad_control_braces_line_breaks_highlighting = none +resharper_cpp_bad_declaration_braces_indent_highlighting = none +resharper_cpp_bad_declaration_braces_line_breaks_highlighting = none +resharper_cpp_bad_empty_braces_line_breaks_highlighting = none +resharper_cpp_bad_expression_braces_indent_highlighting = none +resharper_cpp_bad_expression_braces_line_breaks_highlighting = none +resharper_cpp_bad_indent_highlighting = none +resharper_cpp_bad_list_line_breaks_highlighting = none +resharper_cpp_bad_member_access_spaces_highlighting = none +resharper_cpp_bad_namespace_braces_indent_highlighting = none +resharper_cpp_bad_parens_line_breaks_highlighting = none +resharper_cpp_bad_parens_spaces_highlighting = none +resharper_cpp_bad_semicolon_spaces_highlighting = none +resharper_cpp_bad_spaces_after_keyword_highlighting = none +resharper_cpp_bad_square_brackets_spaces_highlighting = none +resharper_cpp_bad_switch_braces_indent_highlighting = none +resharper_cpp_bad_symbol_spaces_highlighting = none +resharper_cpp_boolean_increment_expression_highlighting = warning +resharper_cpp_boost_format_bad_code_highlighting = warning +resharper_cpp_boost_format_legacy_code_highlighting = suggestion +resharper_cpp_boost_format_mixed_args_highlighting = error +resharper_cpp_boost_format_too_few_args_highlighting = error +resharper_cpp_boost_format_too_many_args_highlighting = warning +resharper_cpp_bound_to_delegate_method_is_not_marked_as_u_function_highlighting = warning +resharper_cpp_clang_tidy_abseil_cleanup_ctad_highlighting = none +resharper_cpp_clang_tidy_abseil_duration_addition_highlighting = none +resharper_cpp_clang_tidy_abseil_duration_comparison_highlighting = none +resharper_cpp_clang_tidy_abseil_duration_conversion_cast_highlighting = none +resharper_cpp_clang_tidy_abseil_duration_division_highlighting = none +resharper_cpp_clang_tidy_abseil_duration_factory_float_highlighting = none +resharper_cpp_clang_tidy_abseil_duration_factory_scale_highlighting = none +resharper_cpp_clang_tidy_abseil_duration_subtraction_highlighting = none +resharper_cpp_clang_tidy_abseil_duration_unnecessary_conversion_highlighting = none +resharper_cpp_clang_tidy_abseil_faster_strsplit_delimiter_highlighting = none +resharper_cpp_clang_tidy_abseil_no_internal_dependencies_highlighting = none +resharper_cpp_clang_tidy_abseil_no_namespace_highlighting = none +resharper_cpp_clang_tidy_abseil_redundant_strcat_calls_highlighting = none +resharper_cpp_clang_tidy_abseil_string_find_startswith_highlighting = none +resharper_cpp_clang_tidy_abseil_string_find_str_contains_highlighting = none +resharper_cpp_clang_tidy_abseil_str_cat_append_highlighting = none +resharper_cpp_clang_tidy_abseil_time_comparison_highlighting = none +resharper_cpp_clang_tidy_abseil_time_subtraction_highlighting = none +resharper_cpp_clang_tidy_abseil_upgrade_duration_conversions_highlighting = none +resharper_cpp_clang_tidy_altera_id_dependent_backward_branch_highlighting = none +resharper_cpp_clang_tidy_altera_kernel_name_restriction_highlighting = none +resharper_cpp_clang_tidy_altera_single_work_item_barrier_highlighting = none +resharper_cpp_clang_tidy_altera_struct_pack_align_highlighting = none +resharper_cpp_clang_tidy_altera_unroll_loops_highlighting = none +resharper_cpp_clang_tidy_android_cloexec_accept4_highlighting = none +resharper_cpp_clang_tidy_android_cloexec_accept_highlighting = none +resharper_cpp_clang_tidy_android_cloexec_creat_highlighting = none +resharper_cpp_clang_tidy_android_cloexec_dup_highlighting = none +resharper_cpp_clang_tidy_android_cloexec_epoll_create1_highlighting = none +resharper_cpp_clang_tidy_android_cloexec_epoll_create_highlighting = none +resharper_cpp_clang_tidy_android_cloexec_fopen_highlighting = none +resharper_cpp_clang_tidy_android_cloexec_inotify_init1_highlighting = none +resharper_cpp_clang_tidy_android_cloexec_inotify_init_highlighting = none +resharper_cpp_clang_tidy_android_cloexec_memfd_create_highlighting = none +resharper_cpp_clang_tidy_android_cloexec_open_highlighting = none +resharper_cpp_clang_tidy_android_cloexec_pipe2_highlighting = none +resharper_cpp_clang_tidy_android_cloexec_pipe_highlighting = none +resharper_cpp_clang_tidy_android_cloexec_socket_highlighting = none +resharper_cpp_clang_tidy_android_comparison_in_temp_failure_retry_highlighting = none +resharper_cpp_clang_tidy_boost_use_ranges_highlighting = none +resharper_cpp_clang_tidy_boost_use_to_string_highlighting = suggestion +resharper_cpp_clang_tidy_bugprone_argument_comment_highlighting = suggestion +resharper_cpp_clang_tidy_bugprone_assert_side_effect_highlighting = warning +resharper_cpp_clang_tidy_bugprone_assignment_in_if_condition_highlighting = none +resharper_cpp_clang_tidy_bugprone_bad_signal_to_kill_thread_highlighting = warning +resharper_cpp_clang_tidy_bugprone_bitwise_pointer_cast_highlighting = warning +resharper_cpp_clang_tidy_bugprone_bool_pointer_implicit_conversion_highlighting = none +resharper_cpp_clang_tidy_bugprone_branch_clone_highlighting = warning +resharper_cpp_clang_tidy_bugprone_capturing_this_in_member_variable_highlighting = warning +resharper_cpp_clang_tidy_bugprone_casting_through_void_highlighting = warning +resharper_cpp_clang_tidy_bugprone_chained_comparison_highlighting = warning +resharper_cpp_clang_tidy_bugprone_compare_pointer_to_member_virtual_function_highlighting = warning +resharper_cpp_clang_tidy_bugprone_copy_constructor_init_highlighting = warning +resharper_cpp_clang_tidy_bugprone_crtp_constructor_accessibility_highlighting = suggestion +resharper_cpp_clang_tidy_bugprone_dangling_handle_highlighting = warning +resharper_cpp_clang_tidy_bugprone_dynamic_static_initializers_highlighting = warning +resharper_cpp_clang_tidy_bugprone_easily_swappable_parameters_highlighting = none +resharper_cpp_clang_tidy_bugprone_empty_catch_highlighting = warning +resharper_cpp_clang_tidy_bugprone_exception_escape_highlighting = none +resharper_cpp_clang_tidy_bugprone_fold_init_type_highlighting = warning +resharper_cpp_clang_tidy_bugprone_forwarding_reference_overload_highlighting = warning +resharper_cpp_clang_tidy_bugprone_forward_declaration_namespace_highlighting = warning +resharper_cpp_clang_tidy_bugprone_implicit_widening_of_multiplication_result_highlighting = warning +resharper_cpp_clang_tidy_bugprone_inaccurate_erase_highlighting = warning +resharper_cpp_clang_tidy_bugprone_incorrect_enable_if_highlighting = warning +resharper_cpp_clang_tidy_bugprone_incorrect_enable_shared_from_this_highlighting = warning +resharper_cpp_clang_tidy_bugprone_incorrect_roundings_highlighting = warning +resharper_cpp_clang_tidy_bugprone_inc_dec_in_conditions_highlighting = warning +resharper_cpp_clang_tidy_bugprone_infinite_loop_highlighting = warning +resharper_cpp_clang_tidy_bugprone_integer_division_highlighting = warning +resharper_cpp_clang_tidy_bugprone_lambda_function_name_highlighting = warning +resharper_cpp_clang_tidy_bugprone_macro_parentheses_highlighting = warning +resharper_cpp_clang_tidy_bugprone_macro_repeated_side_effects_highlighting = warning +resharper_cpp_clang_tidy_bugprone_misleading_setter_of_reference_highlighting = warning +resharper_cpp_clang_tidy_bugprone_misplaced_operator_in_strlen_in_alloc_highlighting = warning +resharper_cpp_clang_tidy_bugprone_misplaced_pointer_arithmetic_in_alloc_highlighting = warning +resharper_cpp_clang_tidy_bugprone_misplaced_widening_cast_highlighting = warning +resharper_cpp_clang_tidy_bugprone_move_forwarding_reference_highlighting = warning +resharper_cpp_clang_tidy_bugprone_multiple_new_in_one_expression_highlighting = warning +resharper_cpp_clang_tidy_bugprone_multiple_statement_macro_highlighting = warning +resharper_cpp_clang_tidy_bugprone_multi_level_implicit_pointer_conversion_highlighting = warning +resharper_cpp_clang_tidy_bugprone_narrowing_conversions_highlighting = warning +resharper_cpp_clang_tidy_bugprone_nondeterministic_pointer_iteration_order_highlighting = warning +resharper_cpp_clang_tidy_bugprone_non_zero_enum_to_bool_conversion_highlighting = warning +resharper_cpp_clang_tidy_bugprone_not_null_terminated_result_highlighting = warning +resharper_cpp_clang_tidy_bugprone_no_escape_highlighting = warning +resharper_cpp_clang_tidy_bugprone_optional_value_conversion_highlighting = warning +resharper_cpp_clang_tidy_bugprone_parent_virtual_call_highlighting = warning +resharper_cpp_clang_tidy_bugprone_pointer_arithmetic_on_polymorphic_object_highlighting = warning +resharper_cpp_clang_tidy_bugprone_posix_return_highlighting = warning +resharper_cpp_clang_tidy_bugprone_redundant_branch_condition_highlighting = warning +resharper_cpp_clang_tidy_bugprone_reserved_identifier_highlighting = warning +resharper_cpp_clang_tidy_bugprone_return_const_ref_from_parameter_highlighting = warning +resharper_cpp_clang_tidy_bugprone_shared_ptr_array_mismatch_highlighting = warning +resharper_cpp_clang_tidy_bugprone_signal_handler_highlighting = warning +resharper_cpp_clang_tidy_bugprone_signed_char_misuse_highlighting = warning +resharper_cpp_clang_tidy_bugprone_sizeof_container_highlighting = warning +resharper_cpp_clang_tidy_bugprone_sizeof_expression_highlighting = warning +resharper_cpp_clang_tidy_bugprone_spuriously_wake_up_functions_highlighting = warning +resharper_cpp_clang_tidy_bugprone_standalone_empty_highlighting = warning +resharper_cpp_clang_tidy_bugprone_stringview_nullptr_highlighting = warning +resharper_cpp_clang_tidy_bugprone_string_constructor_highlighting = warning +resharper_cpp_clang_tidy_bugprone_string_integer_assignment_highlighting = warning +resharper_cpp_clang_tidy_bugprone_string_literal_with_embedded_nul_highlighting = warning +resharper_cpp_clang_tidy_bugprone_suspicious_enum_usage_highlighting = warning +resharper_cpp_clang_tidy_bugprone_suspicious_include_highlighting = warning +resharper_cpp_clang_tidy_bugprone_suspicious_memory_comparison_highlighting = warning +resharper_cpp_clang_tidy_bugprone_suspicious_memset_usage_highlighting = warning +resharper_cpp_clang_tidy_bugprone_suspicious_missing_comma_highlighting = warning +resharper_cpp_clang_tidy_bugprone_suspicious_realloc_usage_highlighting = warning +resharper_cpp_clang_tidy_bugprone_suspicious_semicolon_highlighting = warning +resharper_cpp_clang_tidy_bugprone_suspicious_stringview_data_usage_highlighting = warning +resharper_cpp_clang_tidy_bugprone_suspicious_string_compare_highlighting = warning +resharper_cpp_clang_tidy_bugprone_swapped_arguments_highlighting = warning +resharper_cpp_clang_tidy_bugprone_switch_missing_default_case_highlighting = none +resharper_cpp_clang_tidy_bugprone_tagged_union_member_count_highlighting = warning +resharper_cpp_clang_tidy_bugprone_terminating_continue_highlighting = warning +resharper_cpp_clang_tidy_bugprone_throw_keyword_missing_highlighting = warning +resharper_cpp_clang_tidy_bugprone_too_small_loop_variable_highlighting = warning +resharper_cpp_clang_tidy_bugprone_unchecked_optional_access_highlighting = warning +resharper_cpp_clang_tidy_bugprone_undefined_memory_manipulation_highlighting = warning +resharper_cpp_clang_tidy_bugprone_undelegated_constructor_highlighting = warning +resharper_cpp_clang_tidy_bugprone_unhandled_exception_at_new_highlighting = none +resharper_cpp_clang_tidy_bugprone_unhandled_self_assignment_highlighting = warning +resharper_cpp_clang_tidy_bugprone_unintended_char_ostream_output_highlighting = warning +resharper_cpp_clang_tidy_bugprone_unique_ptr_array_mismatch_highlighting = warning +resharper_cpp_clang_tidy_bugprone_unsafe_functions_highlighting = warning +resharper_cpp_clang_tidy_bugprone_unused_local_non_trivial_variable_highlighting = none +resharper_cpp_clang_tidy_bugprone_unused_raii_highlighting = warning +resharper_cpp_clang_tidy_bugprone_unused_return_value_highlighting = warning +resharper_cpp_clang_tidy_bugprone_use_after_move_highlighting = warning +resharper_cpp_clang_tidy_bugprone_virtual_near_miss_highlighting = suggestion +resharper_cpp_clang_tidy_cert_arr39_c_highlighting = none +resharper_cpp_clang_tidy_cert_con36_c_highlighting = none +resharper_cpp_clang_tidy_cert_con54_cpp_highlighting = none +resharper_cpp_clang_tidy_cert_ctr56_cpp_highlighting = none +resharper_cpp_clang_tidy_cert_dcl03_c_highlighting = none +resharper_cpp_clang_tidy_cert_dcl16_c_highlighting = none +resharper_cpp_clang_tidy_cert_dcl37_c_highlighting = none +resharper_cpp_clang_tidy_cert_dcl50_cpp_highlighting = none +resharper_cpp_clang_tidy_cert_dcl51_cpp_highlighting = none +resharper_cpp_clang_tidy_cert_dcl54_cpp_highlighting = none +resharper_cpp_clang_tidy_cert_dcl58_cpp_highlighting = warning +resharper_cpp_clang_tidy_cert_dcl59_cpp_highlighting = none +resharper_cpp_clang_tidy_cert_env33_c_highlighting = none +resharper_cpp_clang_tidy_cert_err09_cpp_highlighting = none +resharper_cpp_clang_tidy_cert_err33_c_highlighting = warning +resharper_cpp_clang_tidy_cert_err34_c_highlighting = suggestion +resharper_cpp_clang_tidy_cert_err52_cpp_highlighting = none +resharper_cpp_clang_tidy_cert_err58_cpp_highlighting = none +resharper_cpp_clang_tidy_cert_err60_cpp_highlighting = warning +resharper_cpp_clang_tidy_cert_err61_cpp_highlighting = none +resharper_cpp_clang_tidy_cert_exp42_c_highlighting = none +resharper_cpp_clang_tidy_cert_fio38_c_highlighting = none +resharper_cpp_clang_tidy_cert_flp30_c_highlighting = warning +resharper_cpp_clang_tidy_cert_flp37_c_highlighting = none +resharper_cpp_clang_tidy_cert_int09_c_highlighting = none +resharper_cpp_clang_tidy_cert_mem57_cpp_highlighting = warning +resharper_cpp_clang_tidy_cert_msc24_c_highlighting = none +resharper_cpp_clang_tidy_cert_msc30_c_highlighting = none +resharper_cpp_clang_tidy_cert_msc32_c_highlighting = none +resharper_cpp_clang_tidy_cert_msc33_c_highlighting = none +resharper_cpp_clang_tidy_cert_msc50_cpp_highlighting = none +resharper_cpp_clang_tidy_cert_msc51_cpp_highlighting = warning +resharper_cpp_clang_tidy_cert_msc54_cpp_highlighting = warning +resharper_cpp_clang_tidy_cert_oop11_cpp_highlighting = none +resharper_cpp_clang_tidy_cert_oop54_cpp_highlighting = none +resharper_cpp_clang_tidy_cert_oop57_cpp_highlighting = warning +resharper_cpp_clang_tidy_cert_oop58_cpp_highlighting = warning +resharper_cpp_clang_tidy_cert_pos44_c_highlighting = none +resharper_cpp_clang_tidy_cert_pos47_c_highlighting = none +resharper_cpp_clang_tidy_cert_sig30_c_highlighting = none +resharper_cpp_clang_tidy_cert_str34_c_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_api_modeling_errno_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_api_modeling_google_g_test_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_api_modeling_llvm_cast_value_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_api_modeling_llvm_return_value_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_api_modeling_trust_nonnull_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_api_modeling_trust_returns_nonnull_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_bitwise_shift_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_builtin_assume_modeling_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_builtin_builtin_functions_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_builtin_no_return_functions_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_call_and_message_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_call_and_message_modeling_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_dereference_modeling_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_divide_zero_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_dynamic_type_propagation_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_fixed_address_dereference_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_nonnil_string_constants_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_non_null_param_checker_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_null_dereference_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_stack_address_escape_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_stack_addr_escape_base_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_undefined_binary_operator_result_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_array_subscript_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_assign_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_branch_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_captured_block_variable_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_new_array_size_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_undef_return_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_core_vla_size_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_cplusplus_array_delete_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_cplusplus_inner_pointer_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_cplusplus_move_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_cplusplus_new_delete_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_cplusplus_new_delete_leaks_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_cplusplus_placement_new_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_cplusplus_pure_virtual_call_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_cplusplus_self_assignment_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_cplusplus_smart_ptr_modeling_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_cplusplus_string_checker_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_deadcode_dead_stores_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_fuchsia_handle_checker_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_nullability_nullable_dereferenced_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_nullability_nullable_passed_to_nonnull_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_nullability_nullable_returned_from_nonnull_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_nullability_null_passed_to_nonnull_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_nullability_null_returned_from_nonnull_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_optin_core_enum_cast_out_of_range_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_optin_cplusplus_uninitialized_object_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_optin_cplusplus_virtual_call_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_optin_mpi_mpi_checker_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_optin_osx_cocoa_localizability_empty_localization_context_checker_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_optin_osx_cocoa_localizability_non_localized_string_checker_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_optin_osx_os_object_c_style_cast_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_optin_performance_gcd_antipattern_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_optin_performance_padding_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_optin_portability_unix_api_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_optin_taint_generic_taint_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_optin_taint_tainted_alloc_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_optin_taint_tainted_div_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_optin_taint_taint_propagation_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_api_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_at_sync_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_autorelease_write_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_class_release_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_dealloc_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_incompatible_method_types_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_loops_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_missing_super_call_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_nil_arg_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_non_nil_return_value_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_ns_autorelease_pool_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_ns_error_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_obj_c_generics_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_retain_count_base_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_retain_count_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_run_loop_autorelease_leak_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_self_init_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_super_dealloc_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_unused_ivars_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_variadic_method_types_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_cf_error_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_cf_number_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_cf_retain_release_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_containers_out_of_bounds_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_containers_pointer_sized_values_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_mig_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_ns_or_cf_error_deref_checker_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_number_object_conversion_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_obj_c_property_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_os_object_retain_count_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_osx_sec_keychain_api_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_security_array_bound_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_security_cert_env_invalid_ptr_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_security_float_loop_counter_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_bcmp_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_bcopy_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_bzero_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_decode_value_of_obj_c_type_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_deprecated_or_unsafe_buffer_handling_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_getpw_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_gets_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_mkstemp_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_mktemp_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_rand_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_security_syntax_checker_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_strcpy_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_unchecked_return_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_vfork_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_security_mmap_write_exec_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_security_pointer_sub_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_security_putenv_stack_array_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_security_setgid_setuid_order_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_unix_api_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_unix_block_in_critical_section_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_unix_chroot_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_unix_cstring_bad_size_arg_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_unix_cstring_c_string_modeling_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_unix_cstring_not_null_terminated_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_unix_cstring_null_arg_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_unix_dynamic_memory_modeling_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_unix_errno_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_unix_malloc_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_unix_malloc_sizeof_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_unix_mismatched_deallocator_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_unix_std_c_library_functions_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_unix_stream_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_unix_vfork_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_valist_copy_to_self_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_valist_uninitialized_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_valist_unterminated_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_valist_valist_base_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_webkit_no_uncounted_member_checker_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_webkit_ref_cntbl_base_virtual_dtor_highlighting = none +resharper_cpp_clang_tidy_clang_analyzer_webkit_uncounted_lambda_captures_checker_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_aarch64_sme_attributes_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_absolute_value_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_abstract_final_class_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_abstract_vbase_init_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_address_of_packed_member_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_address_of_temporary_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_aix_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_alias_template_in_declaration_name_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_align_mismatch_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_alloca_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_alloca_with_align_alignof_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_always_inline_coroutine_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_delete_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_ellipsis_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_macro_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_member_template_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_reversed_operator_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_analyzer_incompatible_plugin_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_android_unversioned_fallback_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_anonymous_pack_parens_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_anon_enum_enum_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_arc_bridge_casts_disallowed_in_nonarc_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_arc_maybe_repeated_use_of_weak_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_arc_non_pod_memaccess_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_arc_perform_selector_leaks_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_arc_repeated_use_of_weak_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_arc_retain_cycles_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_arc_unsafe_retained_assign_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_argument_outside_range_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_argument_undefined_behaviour_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_arm_interrupt_save_fp_no_vfp_unit_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_arm_interrupt_vfp_clobber_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_array_bounds_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_array_bounds_pointer_arithmetic_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_array_compare_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_array_parameter_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_asm_operand_widths_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_assign_enum_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_assume_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_atimport_in_framework_header_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_atomic_access_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_atomic_alignment_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_atomic_implicit_seq_cst_highlighting = suggestion +resharper_cpp_clang_tidy_clang_diagnostic_atomic_memory_ordering_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_atomic_property_with_user_defined_accessor_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_attribute_packed_for_bitfield_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_attribute_warning_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_at_protocol_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_auto_decl_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_auto_disable_vptr_sanitizer_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_auto_import_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_auto_storage_class_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_auto_var_id_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_availability_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_avr_rtlib_linking_quirks_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_backslash_newline_escape_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_bad_function_cast_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_bind_to_temporary_copy_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_bitfield_constant_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_bitfield_enum_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_bitfield_width_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_bitwise_conditional_parentheses_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_bitwise_instead_of_logical_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_bitwise_op_parentheses_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_bit_int_extension_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_block_capture_autoreleasing_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_bool_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_bool_operation_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_bounds_safety_counted_by_elt_type_unknown_size_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_braced_scalar_init_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_branch_protection_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_bridge_cast_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_builtin_assume_aligned_alignment_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_builtin_macro_redefined_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_builtin_memcpy_chk_size_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_builtin_requires_header_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_c11_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_c23_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_c23_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_c2x_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_c2x_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_c2y_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_c99_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_c99_designator_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_c99_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_called_once_parameter_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_call_to_pure_virtual_from_ctor_dtor_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cast_align_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cast_calling_convention_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cast_function_type_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cast_function_type_mismatch_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cast_function_type_strict_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cast_of_sel_type_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cast_qual_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cast_qual_unrelated_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cfi_unchecked_callee_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cf_string_literal_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_character_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_char_subscripts_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_clang_cl_pch_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_class_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_class_varargs_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cmse_union_leak_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_comma_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_comment_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_compare_distinct_pointer_types_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_completion_handler_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_complex_component_init_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_compound_token_split_by_macro_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_compound_token_split_by_space_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_compound_token_split_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_conditional_type_mismatch_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_conditional_uninitialized_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_config_macros_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_constant_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_constant_evaluated_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_constant_logical_operand_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_constexpr_not_const_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_consumed_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_coroutine_missing_unhandled_exception_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_coro_non_aligned_allocation_function_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_coro_type_aware_allocation_function_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_covered_switch_default_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp11_compat_deprecated_writable_strings_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp11_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp11_compat_pedantic_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp11_compat_reserved_user_defined_literal_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp11_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp11_extra_semi_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp11_inline_namespace_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp11_long_long_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp11_narrowing_const_reference_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp11_narrowing_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp14_attribute_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp14_binary_literal_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp14_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp14_compat_pedantic_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp14_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp17_attribute_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp17_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp17_compat_mangling_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp17_compat_pedantic_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp17_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp20_attribute_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp20_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp20_compat_pedantic_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp20_designator_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp20_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp23_attribute_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp23_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp23_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp23_lambda_attributes_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp26_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp2a_compat_pedantic_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp2a_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp2b_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp2c_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp2c_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_bind_to_temporary_copy_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_extra_semi_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_local_type_template_args_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_pedantic_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_unnamed_type_template_args_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_compat_binary_literal_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_compat_pedantic_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_cpp14_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_cpp14_compat_pedantic_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_cpp14_cpp17_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_cpp14_cpp17_compat_pedantic_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp_hidden_decl_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp_keyword_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cpp_unterminated_string_initialization_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cstring_format_directive_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_ctad_maybe_unsupported_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_ctu_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_cuda_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_custom_atomic_properties_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_cxx_attribute_extension_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_c_attribute_extension_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_dangling_assignment_gsl_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_dangling_assignment_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_dangling_capture_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_dangling_else_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_dangling_field_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_dangling_gsl_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_dangling_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_dangling_initializer_list_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_darwin_sdk_settings_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_date_time_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_dealloc_in_category_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_debug_compression_unavailable_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_declaration_after_statement_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_decls_in_multiple_modules_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_defaulted_function_deleted_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_default_const_init_field_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_default_const_init_field_unsafe_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_default_const_init_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_default_const_init_unsafe_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_default_const_init_var_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_default_const_init_var_unsafe_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_delegating_ctor_cycles_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_delete_abstract_non_virtual_dtor_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_delete_incomplete_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_delete_non_abstract_non_virtual_dtor_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_delete_non_virtual_dtor_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_delimited_escape_sequence_extension_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_altivec_src_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_anon_enum_enum_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_array_compare_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_attributes_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_builtins_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_comma_subscript_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_copy_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_copy_with_dtor_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_copy_with_user_provided_copy_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_copy_with_user_provided_dtor_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_coroutine_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_declarations_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_declarations_switch_case_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_dynamic_exception_spec_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_enum_compare_conditional_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_enum_compare_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_enum_enum_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_enum_float_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_implementations_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_increment_bool_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_literal_operator_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_missing_comma_variadic_parameter_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_non_prototype_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_objc_isa_usage_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_objc_pointer_introspection_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_objc_pointer_introspection_perform_selector_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_octal_literals_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_ofast_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_pragma_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_redundant_constexpr_static_def_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_register_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_this_capture_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_type_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecated_volatile_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_deprecate_lax_vec_conv_all_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_direct_ivar_access_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_disabled_macro_expansion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_distributed_object_modifiers_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_division_by_zero_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_dllexport_explicit_instantiation_decl_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_dllimport_static_field_def_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_dll_attribute_on_redeclaration_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_documentation_deprecated_sync_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_documentation_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_documentation_html_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_documentation_pedantic_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_documentation_unknown_command_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_dollar_in_identifier_extension_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_double_promotion_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_dtor_name_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_dtor_typedef_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_duplicate_decl_specifier_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_duplicate_enum_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_duplicate_method_arg_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_duplicate_method_match_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_duplicate_protocol_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_dxil_validation_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_dynamic_class_memaccess_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_dynamic_exception_spec_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_eager_load_cxx_named_modules_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_embedded_directive_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_empty_body_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_empty_decomposition_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_empty_init_stmt_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_empty_translation_unit_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_encode_type_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_enum_compare_conditional_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_enum_compare_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_enum_compare_switch_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_enum_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_enum_enum_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_enum_float_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_enum_too_large_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_error_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_exceptions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_excessive_regsave_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_excess_initializers_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_exit_time_destructors_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_expansion_to_defined_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_experimental_header_units_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_experimental_lifetime_safety_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_experimental_option_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_explicit_initialize_call_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_explicit_ownership_type_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_explicit_specialization_storage_class_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_export_unnamed_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_extern_c_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_extern_initializer_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_extractapi_misuse_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_extra_qualification_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_extra_semi_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_extra_semi_stmt_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_extra_tokens_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_ext_cxx_type_aware_allocators_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_final_dtor_non_final_class_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_final_macro_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_fixed_point_overflow_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_flag_enum_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_flexible_array_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_float_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_float_equal_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_float_overflow_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_float_zero_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_format_extra_args_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_format_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_format_insufficient_args_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_format_invalid_specifier_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_format_nonliteral_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_format_non_iso_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_format_overflow_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_format_overflow_non_kprintf_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_format_pedantic_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_format_security_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_format_signedness_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_format_truncation_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_format_truncation_non_kprintf_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_format_type_confusion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_format_zero_length_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_fortify_source_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_for_loop_analysis_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_four_char_constants_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_framework_include_private_from_public_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_frame_address_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_frame_larger_than_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_free_nonheap_object_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_friend_enum_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_function_def_in_objc_container_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_function_effects_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_function_multiversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_future_attribute_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gcc_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_global_constructors_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_global_isel_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_alignof_expression_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_anonymous_struct_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_gnu_array_member_paren_init_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_auto_type_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_binary_literal_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_case_range_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_complex_integer_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_compound_literal_initializer_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_conditional_omitted_operand_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_designator_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_empty_initializer_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_empty_struct_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_flexible_array_initializer_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_flexible_array_union_member_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_folding_constant_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_imaginary_constant_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_include_next_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_inline_cpp_without_extern_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_label_as_value_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_line_marker_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_null_pointer_arithmetic_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_offsetof_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_pointer_arith_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_redeclared_enum_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_statement_expression_from_macro_expansion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_statement_expression_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_static_float_init_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_string_literal_operator_template_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_union_cast_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_variable_sized_type_not_at_end_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gnu_zero_variadic_macro_arguments_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_gpu_maybe_wrong_side_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_header_guard_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_header_hygiene_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_higher_precision_for_complex_division_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_hip_omp_target_directives_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_hip_only_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_hlsl202y_extensions_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_hlsl_availability_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_hlsl_dxc_compatability_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_hlsl_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_hlsl_implicit_binding_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_idiomatic_parentheses_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_ignored_attributes_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_ignored_availability_without_sdk_settings_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_ignored_base_class_qualifiers_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_ignored_optimization_argument_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_ignored_pragmas_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_ignored_pragma_intrinsic_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_ignored_pragma_optimize_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_ignored_qualifiers_highlighting = suggestion +resharper_cpp_clang_tidy_clang_diagnostic_ignored_reference_qualifiers_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_implicitly_unsigned_literal_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_atomic_properties_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_const_int_float_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_conversion_floating_point_to_bool_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_enum_enum_cast_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_exception_spec_mismatch_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_fallthrough_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_fallthrough_per_function_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_fixed_point_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_float_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_function_declaration_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_int_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_int_conversion_on_negation_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_int_enum_cast_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_int_float_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_int_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_retain_self_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_implicit_void_ptr_cast_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_import_implementation_partition_unit_in_interface_unit_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_import_preprocessor_directive_pedantic_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_inaccessible_base_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_include_angled_in_module_purview_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_include_next_absolute_path_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_include_next_outside_header_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_incompatible_exception_spec_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_incompatible_function_pointer_types_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_incompatible_function_pointer_types_strict_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_incompatible_library_redeclaration_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_incompatible_ms_pragma_section_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_incompatible_ms_struct_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_incompatible_pointer_types_discards_qualifiers_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_incompatible_pointer_types_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_incompatible_property_type_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_incompatible_sysroot_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_incomplete_framework_module_declaration_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_incomplete_implementation_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_incomplete_module_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_incomplete_setjmp_declaration_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_incomplete_umbrella_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_inconsistent_dllimport_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_inconsistent_missing_destructor_override_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_inconsistent_missing_override_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_increment_bool_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_independent_class_attribute_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_infinite_recursion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_initializer_overrides_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_init_priority_reserved_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_injected_class_name_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_inline_asm_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_inline_namespace_reopened_noninline_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_inline_new_delete_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_installapi_violation_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_instantiation_after_specialization_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_integer_overflow_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_int_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_int_in_bool_context_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_int_to_pointer_cast_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_int_to_void_pointer_cast_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_constexpr_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_gnu_asm_cast_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_iboutlet_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_initializer_from_system_header_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_ios_deployment_target_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_noreturn_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_no_builtin_names_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_offsetof_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_or_nonexistent_directory_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_partial_specialization_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_pp_token_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_source_encoding_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_static_assert_message_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_token_paste_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_unevaluated_string_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_utf8_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_invalid_version_availability_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_jump_misses_init_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_jump_seh_finally_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_keyword_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_keyword_macro_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_knr_promoted_parameter_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_language_extension_token_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_large_by_value_copy_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_legacy_constant_register_binding_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_linker_warnings_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_literal_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_literal_range_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_local_type_template_args_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_logical_not_parentheses_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_logical_op_parentheses_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_long_long_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_macro_redefined_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_main_attached_to_named_module_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_main_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_main_return_type_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_malformed_warning_check_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_many_braces_around_scalar_init_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_mathematical_notation_identifier_extension_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_math_errno_enabled_with_veclib_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_max_tokens_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_max_unsigned_zero_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_memset_transposed_args_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_memsize_comparison_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_method_signatures_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_abstract_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_anon_tag_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_cast_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_charize_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_comment_paste_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_const_init_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_cpp_macro_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_default_arg_redefinition_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_drectve_section_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_end_of_file_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_enum_forward_reference_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_enum_value_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_exception_spec_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_exists_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_explicit_constructor_call_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_extra_qualification_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_fixed_enum_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_flexible_array_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_goto_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_inaccessible_base_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_include_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_init_from_predefined_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_inline_on_non_function_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_mutable_reference_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_pure_definition_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_redeclare_static_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_sealed_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_string_literal_from_predefined_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_template_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_template_shadow_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_union_member_reference_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_unqualified_friend_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_using_decl_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_microsoft_void_pseudo_dtor_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_misexpect_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_misleading_indentation_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_mismatched_new_delete_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_mismatched_parameter_types_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_mismatched_return_types_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_mismatched_tags_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_braces_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_constinit_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_declarations_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_designated_field_initializers_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_exception_spec_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_field_initializers_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_method_return_type_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_multilib_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_noescape_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_noreturn_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_prototypes_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_missing_prototype_for_cc_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_selector_name_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_sysroot_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_template_arg_list_after_template_kw_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_missing_variable_declarations_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_misspelled_assumption_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_mix_packoffset_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_modules_ambiguous_internal_linkage_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_modules_import_nested_redundant_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_module_conflict_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_module_file_config_mismatch_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_module_file_extension_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_module_file_mapping_mismatch_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_module_import_in_extern_c_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_msvc_not_found_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_ms_bitfield_padding_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_multichar_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_multilib_not_found_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_multiple_move_vbase_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_multi_gpu_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_nan_infinity_disabled_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_nested_anon_types_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_newline_eof_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_new_returns_null_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_noderef_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_nonnull_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_nonportable_include_path_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_nonportable_system_include_path_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_nonportable_vector_initialization_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_nontrivial_memaccess_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_nontrivial_memcall_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_non_c_typedef_for_linkage_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_non_literal_null_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_non_modular_include_in_framework_module_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_non_modular_include_in_module_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_non_pod_varargs_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_non_power_of_two_alignment_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_non_virtual_dtor_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_nrvo_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_nsconsumed_mismatch_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_nsreturns_mismatch_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_ns_object_attribute_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_nullability_completeness_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_nullability_completeness_on_arrays_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_nullability_declspec_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_nullability_extension_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_nullability_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_nullability_inferred_on_nested_type_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_nullable_to_nonnull_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_null_arithmetic_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_null_character_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_null_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_null_dereference_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_null_pointer_arithmetic_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_null_pointer_subtraction_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_nvcc_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_octal_prefix_extension_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_odr_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_old_style_cast_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_openacc_cache_var_inside_loop_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_openacc_confusing_routine_name_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_openacc_deprecated_clause_alias_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_openacc_self_if_potential_conflict_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_opencl_unsupported_rgba_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_openmp51_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_openmp_clauses_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_openmp_extensions_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_openmp_future_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_openmp_loop_form_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_openmp_mapping_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_openmp_target_exception_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_openmp_target_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_option_ignored_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_ordered_compare_function_pointers_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_out_of_line_declaration_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_out_of_scope_function_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_overlength_strings_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_overloaded_shift_op_parentheses_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_overloaded_virtual_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_override_init_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_override_module_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_overriding_deployment_version_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_overriding_method_mismatch_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_overriding_option_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_over_aligned_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_packed_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_packed_non_pod_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_padded_bitfield_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_padded_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_parentheses_equality_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_parentheses_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_pass_failed_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_pch_date_time_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_pedantic_core_features_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_pedantic_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_pedantic_macros_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_perf_constraint_implies_noexcept_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_pessimizing_move_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_pointer_arith_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_pointer_bool_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_pointer_compare_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_pointer_integer_compare_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_pointer_sign_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_pointer_to_enum_cast_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_pointer_to_int_cast_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_pointer_type_mismatch_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_poison_system_directories_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_potentially_evaluated_expression_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_pragmas_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_pragma_clang_attribute_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_pragma_messages_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_pragma_once_outside_header_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_pragma_pack_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_pragma_pack_suspicious_include_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_pragma_system_header_outside_header_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_predefined_identifier_outside_function_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_preferred_type_bitfield_enum_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_pre_c11_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_pre_c11_compat_pedantic_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_pre_c23_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_pre_c23_compat_pedantic_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_pre_c2x_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_pre_c2x_compat_pedantic_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_pre_c2y_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_pre_c2y_compat_pedantic_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp14_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp14_compat_pedantic_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp17_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp17_compat_pedantic_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp20_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp20_compat_pedantic_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp23_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp23_compat_pedantic_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp26_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp26_compat_pedantic_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp2c_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp2c_compat_pedantic_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_pre_openmp51_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_private_extern_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_private_header_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_private_module_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_profile_instr_missing_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_profile_instr_out_of_date_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_profile_instr_unprofiled_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_property_access_dot_syntax_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_property_attribute_mismatch_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_protocol_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_protocol_property_synthesis_ambiguity_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_psabi_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_ptrauth_null_pointers_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_qualified_void_return_type_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_quoted_include_in_framework_header_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_range_loop_analysis_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_range_loop_bind_reference_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_range_loop_construct_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_readonly_iboutlet_property_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_read_only_types_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_receiver_expr_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_receiver_forward_class_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_redeclared_class_member_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_redundant_attribute_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_redundant_consteval_if_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_redundant_move_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_redundant_parens_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_register_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_reinterpret_base_class_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_reorder_ctor_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_reorder_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_reorder_init_list_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_requires_super_attribute_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_reserved_attribute_identifier_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_reserved_identifier_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_reserved_id_macro_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_reserved_macro_identifier_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_reserved_module_identifier_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_reserved_user_defined_literal_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_restrict_expansion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_retained_language_linkage_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_return_local_addr_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_return_mismatch_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_return_stack_address_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_return_std_move_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_return_type_c_linkage_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_return_type_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_rewrite_not_bool_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_sarif_format_unstable_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_section_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_selector_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_selector_type_mismatch_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_self_assign_field_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_self_assign_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_self_assign_overloaded_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_self_move_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_semicolon_before_method_body_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_sentinel_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_serialized_diagnostics_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_shadow_field_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_shadow_field_in_constructor_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_shadow_field_in_constructor_modified_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_shadow_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_shadow_ivar_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_shadow_uncaptured_local_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_shift_bool_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_shift_count_negative_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_shift_count_overflow_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_shift_negative_value_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_shift_op_parentheses_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_shift_overflow_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_shift_sign_overflow_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_shorten64_to32_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_signed_enum_bitfield_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_signed_unsigned_wchar_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_sign_compare_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_sign_conversion_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_single_bit_bitfield_constant_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_sizeof_array_argument_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_sizeof_array_decay_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_sizeof_array_div_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_sizeof_pointer_div_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_sizeof_pointer_memaccess_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_slash_u_filename_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_slh_asm_goto_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_sometimes_uninitialized_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_source_uses_openacc_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_source_uses_openmp_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_spirv_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_spir_compat_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_static_float_init_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_static_inline_explicit_instantiation_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_static_in_inline_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_static_local_in_inline_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_static_self_init_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_stdlibcxx_not_found_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_strict_primary_template_shadow_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_strict_prototypes_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_strict_selector_match_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_string_compare_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_string_concatenation_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_string_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_string_plus_char_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_string_plus_int_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_strlcpy_strlcat_size_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_strncat_size_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_suggest_destructor_override_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_suggest_override_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_super_class_method_mismatch_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_suspicious_bzero_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_switch_bool_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_switch_default_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_switch_enum_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_switch_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_sync_alignment_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_sync_fetch_and_nand_semantics_changed_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_target_clones_mixed_specifiers_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_tautological_bitwise_compare_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_compare_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_constant_compare_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_constant_in_range_compare_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_constant_out_of_range_compare_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_negation_compare_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_objc_bool_compare_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_overlap_compare_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_pointer_compare_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_type_limit_compare_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_undefined_compare_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_unsigned_char_zero_compare_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_unsigned_enum_zero_compare_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_tautological_unsigned_zero_compare_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_tautological_value_range_compare_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_template_in_declaration_name_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_tentative_definition_array_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_tentative_definition_compat_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_tentative_definition_incomplete_type_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_analysis_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_attributes_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_beta_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_negative_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_pointer_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_precise_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_reference_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_reference_return_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_verbose_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_trigraphs_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_typedef_redefinition_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_typename_missing_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_type_safety_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unable_to_open_stats_file_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unaligned_access_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unaligned_qualifier_implicit_cast_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unavailable_declarations_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_undeclared_selector_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_undefined_arm_za_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_undefined_arm_zt0_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_undefined_bool_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_undefined_func_template_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_undefined_inline_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_undefined_internal_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_undefined_internal_type_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_undefined_reinterpret_cast_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_undefined_var_template_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_undef_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_undef_prefix_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_undef_true_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_underaligned_exception_object_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_underlying_atomic_qualifier_ignored_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_underlying_cv_qualifier_ignored_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unevaluated_expression_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unguarded_availability_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unguarded_availability_new_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unicode_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unicode_homoglyph_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unicode_whitespace_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unicode_zero_width_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_uninitialized_const_pointer_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_uninitialized_const_reference_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_uninitialized_explicit_init_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_uninitialized_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unique_object_duplication_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unknown_acc_extension_clause_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unknown_argument_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unknown_attributes_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_unknown_cuda_version_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_unknown_directives_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unknown_escape_sequence_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unknown_pragmas_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_unknown_sanitizers_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unknown_warning_option_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unnamed_type_template_args_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unnecessary_virtual_specifier_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unneeded_internal_declaration_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_unneeded_member_function_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unqualified_std_cast_call_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unreachable_code_break_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unreachable_code_fallthrough_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unreachable_code_generic_assoc_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unreachable_code_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unreachable_code_loop_increment_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unreachable_code_return_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unsafe_buffer_usage_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_unsafe_buffer_usage_in_container_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_unsafe_buffer_usage_in_libc_call_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_unsequenced_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unsupported_abi_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unsupported_abs_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unsupported_availability_guard_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unsupported_cb_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unsupported_dll_base_class_template_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unsupported_friend_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unsupported_gpopt_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unsupported_nan_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unsupported_target_opt_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_unsupported_visibility_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unterminated_string_initialization_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unusable_partial_specialization_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_but_set_parameter_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_unused_but_set_variable_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_unused_comparison_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_const_variable_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_exception_parameter_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_function_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_getter_return_value_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_label_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_lambda_capture_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_unused_local_typedef_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_unused_macros_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_member_function_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_parameter_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_unused_private_field_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_property_ivar_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_result_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_unused_template_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_unused_value_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_unused_variable_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_unused_volatile_lvalue_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_used_but_marked_unused_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_user_defined_literals_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_user_defined_warnings_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_varargs_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_variadic_macros_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_variadic_macro_arguments_omitted_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_vector_conversion_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_vec_elem_size_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_vexing_parse_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_visibility_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_vla_cxx_extension_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_vla_extension_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_vla_extension_static_assert_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_vla_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_void_pointer_to_enum_cast_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_void_pointer_to_int_cast_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_void_ptr_dereference_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_warnings_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_warning_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_wasm_exception_spec_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_weak_template_vtables_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_weak_vtables_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_writable_strings_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_xor_used_as_pow_highlighting = warning +resharper_cpp_clang_tidy_clang_diagnostic_zero_as_null_pointer_constant_highlighting = none +resharper_cpp_clang_tidy_clang_diagnostic_zero_length_array_highlighting = warning +resharper_cpp_clang_tidy_concurrency_mt_unsafe_highlighting = warning +resharper_cpp_clang_tidy_concurrency_thread_canceltype_asynchronous_highlighting = warning +resharper_cpp_clang_tidy_cppcoreguidelines_avoid_capturing_lambda_coroutines_highlighting = warning +resharper_cpp_clang_tidy_cppcoreguidelines_avoid_const_or_ref_data_members_highlighting = warning +resharper_cpp_clang_tidy_cppcoreguidelines_avoid_c_arrays_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_avoid_do_while_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_avoid_goto_highlighting = warning +resharper_cpp_clang_tidy_cppcoreguidelines_avoid_magic_numbers_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_avoid_non_const_global_variables_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_avoid_reference_coroutine_parameters_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_c_copy_assignment_signature_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_explicit_virtual_functions_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_init_variables_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_interfaces_global_init_highlighting = warning +resharper_cpp_clang_tidy_cppcoreguidelines_macro_to_enum_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_macro_usage_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_misleading_capture_default_by_value_highlighting = warning +resharper_cpp_clang_tidy_cppcoreguidelines_missing_std_forward_highlighting = warning +resharper_cpp_clang_tidy_cppcoreguidelines_narrowing_conversions_highlighting = warning +resharper_cpp_clang_tidy_cppcoreguidelines_noexcept_destructor_highlighting = warning +resharper_cpp_clang_tidy_cppcoreguidelines_noexcept_move_operations_highlighting = warning +resharper_cpp_clang_tidy_cppcoreguidelines_noexcept_swap_highlighting = warning +resharper_cpp_clang_tidy_cppcoreguidelines_non_private_member_variables_in_classes_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_no_malloc_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_no_suspend_with_lock_highlighting = warning +resharper_cpp_clang_tidy_cppcoreguidelines_owning_memory_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_prefer_member_initializer_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_pro_bounds_array_to_pointer_decay_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_pro_bounds_constant_array_index_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_pro_bounds_pointer_arithmetic_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_const_cast_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_cstyle_cast_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_member_init_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_reinterpret_cast_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_static_cast_downcast_highlighting = suggestion +resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_union_access_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_vararg_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_rvalue_reference_param_not_moved_highlighting = warning +resharper_cpp_clang_tidy_cppcoreguidelines_slicing_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_special_member_functions_highlighting = suggestion +resharper_cpp_clang_tidy_cppcoreguidelines_use_default_member_init_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_use_enum_class_highlighting = none +resharper_cpp_clang_tidy_cppcoreguidelines_virtual_class_destructor_highlighting = none +resharper_cpp_clang_tidy_darwin_avoid_spinlock_highlighting = none +resharper_cpp_clang_tidy_darwin_dispatch_once_nonstatic_highlighting = none +resharper_cpp_clang_tidy_fuchsia_default_arguments_calls_highlighting = none +resharper_cpp_clang_tidy_fuchsia_default_arguments_declarations_highlighting = none +resharper_cpp_clang_tidy_fuchsia_header_anon_namespaces_highlighting = none +resharper_cpp_clang_tidy_fuchsia_multiple_inheritance_highlighting = none +resharper_cpp_clang_tidy_fuchsia_overloaded_operator_highlighting = none +resharper_cpp_clang_tidy_fuchsia_statically_constructed_objects_highlighting = none +resharper_cpp_clang_tidy_fuchsia_trailing_return_highlighting = none +resharper_cpp_clang_tidy_fuchsia_virtual_inheritance_highlighting = none +resharper_cpp_clang_tidy_google_build_explicit_make_pair_highlighting = none +resharper_cpp_clang_tidy_google_build_namespaces_highlighting = none +resharper_cpp_clang_tidy_google_build_using_namespace_highlighting = none +resharper_cpp_clang_tidy_google_default_arguments_highlighting = none +resharper_cpp_clang_tidy_google_explicit_constructor_highlighting = none +resharper_cpp_clang_tidy_google_global_names_in_headers_highlighting = none +resharper_cpp_clang_tidy_google_objc_avoid_nsobject_new_highlighting = none +resharper_cpp_clang_tidy_google_objc_avoid_throwing_exception_highlighting = none +resharper_cpp_clang_tidy_google_objc_function_naming_highlighting = none +resharper_cpp_clang_tidy_google_objc_global_variable_declaration_highlighting = none +resharper_cpp_clang_tidy_google_readability_avoid_underscore_in_googletest_name_highlighting = none +resharper_cpp_clang_tidy_google_readability_braces_around_statements_highlighting = none +resharper_cpp_clang_tidy_google_readability_casting_highlighting = none +resharper_cpp_clang_tidy_google_readability_function_size_highlighting = none +resharper_cpp_clang_tidy_google_readability_namespace_comments_highlighting = none +resharper_cpp_clang_tidy_google_readability_todo_highlighting = none +resharper_cpp_clang_tidy_google_runtime_int_highlighting = none +resharper_cpp_clang_tidy_google_runtime_operator_highlighting = warning +resharper_cpp_clang_tidy_google_upgrade_googletest_case_highlighting = suggestion +resharper_cpp_clang_tidy_hicpp_avoid_c_arrays_highlighting = none +resharper_cpp_clang_tidy_hicpp_avoid_goto_highlighting = warning +resharper_cpp_clang_tidy_hicpp_braces_around_statements_highlighting = none +resharper_cpp_clang_tidy_hicpp_deprecated_headers_highlighting = none +resharper_cpp_clang_tidy_hicpp_exception_baseclass_highlighting = suggestion +resharper_cpp_clang_tidy_hicpp_explicit_conversions_highlighting = none +resharper_cpp_clang_tidy_hicpp_function_size_highlighting = none +resharper_cpp_clang_tidy_hicpp_ignored_remove_result_highlighting = warning +resharper_cpp_clang_tidy_hicpp_invalid_access_moved_highlighting = none +resharper_cpp_clang_tidy_hicpp_member_init_highlighting = none +resharper_cpp_clang_tidy_hicpp_move_const_arg_highlighting = none +resharper_cpp_clang_tidy_hicpp_multiway_paths_covered_highlighting = warning +resharper_cpp_clang_tidy_hicpp_named_parameter_highlighting = none +resharper_cpp_clang_tidy_hicpp_new_delete_operators_highlighting = none +resharper_cpp_clang_tidy_hicpp_noexcept_move_highlighting = none +resharper_cpp_clang_tidy_hicpp_no_array_decay_highlighting = none +resharper_cpp_clang_tidy_hicpp_no_assembler_highlighting = none +resharper_cpp_clang_tidy_hicpp_no_malloc_highlighting = none +resharper_cpp_clang_tidy_hicpp_signed_bitwise_highlighting = none +resharper_cpp_clang_tidy_hicpp_special_member_functions_highlighting = none +resharper_cpp_clang_tidy_hicpp_static_assert_highlighting = none +resharper_cpp_clang_tidy_hicpp_undelegated_constructor_highlighting = none +resharper_cpp_clang_tidy_hicpp_uppercase_literal_suffix_highlighting = none +resharper_cpp_clang_tidy_hicpp_use_auto_highlighting = none +resharper_cpp_clang_tidy_hicpp_use_emplace_highlighting = none +resharper_cpp_clang_tidy_hicpp_use_equals_default_highlighting = none +resharper_cpp_clang_tidy_hicpp_use_equals_delete_highlighting = none +resharper_cpp_clang_tidy_hicpp_use_noexcept_highlighting = none +resharper_cpp_clang_tidy_hicpp_use_nullptr_highlighting = none +resharper_cpp_clang_tidy_hicpp_use_override_highlighting = none +resharper_cpp_clang_tidy_hicpp_vararg_highlighting = none +resharper_cpp_clang_tidy_highlighting_highlighting = suggestion +resharper_cpp_clang_tidy_linuxkernel_must_check_errs_highlighting = warning +resharper_cpp_clang_tidy_llvmlibc_callee_namespace_highlighting = none +resharper_cpp_clang_tidy_llvmlibc_implementation_in_namespace_highlighting = none +resharper_cpp_clang_tidy_llvmlibc_inline_function_decl_highlighting = none +resharper_cpp_clang_tidy_llvmlibc_restrict_system_libc_headers_highlighting = none +resharper_cpp_clang_tidy_llvm_else_after_return_highlighting = none +resharper_cpp_clang_tidy_llvm_header_guard_highlighting = none +resharper_cpp_clang_tidy_llvm_include_order_highlighting = none +resharper_cpp_clang_tidy_llvm_namespace_comment_highlighting = none +resharper_cpp_clang_tidy_llvm_prefer_isa_or_dyn_cast_in_conditionals_highlighting = none +resharper_cpp_clang_tidy_llvm_prefer_register_over_unsigned_highlighting = suggestion +resharper_cpp_clang_tidy_llvm_prefer_static_over_anonymous_namespace_highlighting = none +resharper_cpp_clang_tidy_llvm_qualified_auto_highlighting = none +resharper_cpp_clang_tidy_llvm_twine_local_highlighting = none +resharper_cpp_clang_tidy_misc_confusable_identifiers_highlighting = warning +resharper_cpp_clang_tidy_misc_const_correctness_highlighting = none +resharper_cpp_clang_tidy_misc_coroutine_hostile_raii_highlighting = warning +resharper_cpp_clang_tidy_misc_definitions_in_headers_highlighting = none +resharper_cpp_clang_tidy_misc_header_include_cycle_highlighting = warning +resharper_cpp_clang_tidy_misc_include_cleaner_highlighting = none +resharper_cpp_clang_tidy_misc_misleading_bidirectional_highlighting = warning +resharper_cpp_clang_tidy_misc_misleading_identifier_highlighting = warning +resharper_cpp_clang_tidy_misc_misplaced_const_highlighting = none +resharper_cpp_clang_tidy_misc_new_delete_overloads_highlighting = warning +resharper_cpp_clang_tidy_misc_non_copyable_objects_highlighting = warning +resharper_cpp_clang_tidy_misc_non_private_member_variables_in_classes_highlighting = none +resharper_cpp_clang_tidy_misc_no_recursion_highlighting = none +resharper_cpp_clang_tidy_misc_redundant_expression_highlighting = warning +resharper_cpp_clang_tidy_misc_static_assert_highlighting = suggestion +resharper_cpp_clang_tidy_misc_throw_by_value_catch_by_reference_highlighting = warning +resharper_cpp_clang_tidy_misc_unconventional_assign_operator_highlighting = warning +resharper_cpp_clang_tidy_misc_uniqueptr_reset_release_highlighting = suggestion +resharper_cpp_clang_tidy_misc_unused_alias_decls_highlighting = suggestion +resharper_cpp_clang_tidy_misc_unused_parameters_highlighting = none +resharper_cpp_clang_tidy_misc_unused_using_decls_highlighting = suggestion +resharper_cpp_clang_tidy_misc_use_anonymous_namespace_highlighting = suggestion +resharper_cpp_clang_tidy_misc_use_internal_linkage_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_avoid_bind_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_avoid_c_arrays_highlighting = none +resharper_cpp_clang_tidy_modernize_concat_nested_namespaces_highlighting = none +resharper_cpp_clang_tidy_modernize_deprecated_headers_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_deprecated_ios_base_aliases_highlighting = warning +resharper_cpp_clang_tidy_modernize_loop_convert_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_macro_to_enum_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_make_shared_highlighting = none +resharper_cpp_clang_tidy_modernize_make_unique_highlighting = none +resharper_cpp_clang_tidy_modernize_min_max_use_initializer_list_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_pass_by_value_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_raw_string_literal_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_redundant_void_arg_highlighting = none +resharper_cpp_clang_tidy_modernize_replace_auto_ptr_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_replace_disallow_copy_and_assign_macro_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_replace_random_shuffle_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_return_braced_init_list_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_shrink_to_fit_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_type_traits_highlighting = none +resharper_cpp_clang_tidy_modernize_unary_static_assert_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_use_auto_highlighting = none +resharper_cpp_clang_tidy_modernize_use_bool_literals_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_use_constraints_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_use_default_member_init_highlighting = none +resharper_cpp_clang_tidy_modernize_use_designated_initializers_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_use_emplace_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_use_equals_default_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_use_equals_delete_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_use_integer_sign_comparison_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_use_nodiscard_highlighting = hint +resharper_cpp_clang_tidy_modernize_use_noexcept_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_use_nullptr_highlighting = none +resharper_cpp_clang_tidy_modernize_use_override_highlighting = none +resharper_cpp_clang_tidy_modernize_use_ranges_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_use_scoped_lock_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_use_starts_ends_with_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_use_std_format_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_use_std_numbers_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_use_std_print_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_use_trailing_return_type_highlighting = none +resharper_cpp_clang_tidy_modernize_use_transparent_functors_highlighting = suggestion +resharper_cpp_clang_tidy_modernize_use_uncaught_exceptions_highlighting = warning +resharper_cpp_clang_tidy_modernize_use_using_highlighting = none +resharper_cpp_clang_tidy_mpi_buffer_deref_highlighting = warning +resharper_cpp_clang_tidy_mpi_type_mismatch_highlighting = warning +resharper_cpp_clang_tidy_objc_assert_equals_highlighting = warning +resharper_cpp_clang_tidy_objc_avoid_nserror_init_highlighting = warning +resharper_cpp_clang_tidy_objc_dealloc_in_category_highlighting = warning +resharper_cpp_clang_tidy_objc_forbidden_subclassing_highlighting = warning +resharper_cpp_clang_tidy_objc_missing_hash_highlighting = warning +resharper_cpp_clang_tidy_objc_nsdate_formatter_highlighting = none +resharper_cpp_clang_tidy_objc_nsinvocation_argument_lifetime_highlighting = warning +resharper_cpp_clang_tidy_objc_property_declaration_highlighting = warning +resharper_cpp_clang_tidy_objc_super_self_highlighting = warning +resharper_cpp_clang_tidy_openmp_exception_escape_highlighting = warning +resharper_cpp_clang_tidy_openmp_use_default_none_highlighting = warning +resharper_cpp_clang_tidy_performance_avoid_endl_highlighting = warning +resharper_cpp_clang_tidy_performance_enum_size_highlighting = suggestion +resharper_cpp_clang_tidy_performance_faster_string_find_highlighting = suggestion +resharper_cpp_clang_tidy_performance_for_range_copy_highlighting = suggestion +resharper_cpp_clang_tidy_performance_implicit_conversion_in_loop_highlighting = suggestion +resharper_cpp_clang_tidy_performance_inefficient_algorithm_highlighting = suggestion +resharper_cpp_clang_tidy_performance_inefficient_string_concatenation_highlighting = suggestion +resharper_cpp_clang_tidy_performance_inefficient_vector_operation_highlighting = suggestion +resharper_cpp_clang_tidy_performance_move_constructor_init_highlighting = warning +resharper_cpp_clang_tidy_performance_move_const_arg_highlighting = suggestion +resharper_cpp_clang_tidy_performance_noexcept_destructor_highlighting = warning +resharper_cpp_clang_tidy_performance_noexcept_move_constructor_highlighting = warning +resharper_cpp_clang_tidy_performance_noexcept_swap_highlighting = warning +resharper_cpp_clang_tidy_performance_no_automatic_move_highlighting = warning +resharper_cpp_clang_tidy_performance_no_int_to_ptr_highlighting = warning +resharper_cpp_clang_tidy_performance_trivially_destructible_highlighting = suggestion +resharper_cpp_clang_tidy_performance_type_promotion_in_math_fn_highlighting = suggestion +resharper_cpp_clang_tidy_performance_unnecessary_copy_initialization_highlighting = suggestion +resharper_cpp_clang_tidy_performance_unnecessary_value_param_highlighting = suggestion +resharper_cpp_clang_tidy_portability_avoid_pragma_once_highlighting = none +resharper_cpp_clang_tidy_portability_restrict_system_includes_highlighting = none +resharper_cpp_clang_tidy_portability_simd_intrinsics_highlighting = none +resharper_cpp_clang_tidy_portability_std_allocator_const_highlighting = warning +resharper_cpp_clang_tidy_portability_template_virtual_member_function_highlighting = warning +resharper_cpp_clang_tidy_readability_ambiguous_smartptr_reset_call_highlighting = suggestion +resharper_cpp_clang_tidy_readability_avoid_const_params_in_decls_highlighting = none +resharper_cpp_clang_tidy_readability_avoid_nested_conditional_operator_highlighting = none +resharper_cpp_clang_tidy_readability_avoid_return_with_void_value_highlighting = none +resharper_cpp_clang_tidy_readability_avoid_unconditional_preprocessor_if_highlighting = warning +resharper_cpp_clang_tidy_readability_braces_around_statements_highlighting = none +resharper_cpp_clang_tidy_readability_const_return_type_highlighting = none +resharper_cpp_clang_tidy_readability_container_contains_highlighting = none +resharper_cpp_clang_tidy_readability_container_data_pointer_highlighting = suggestion +resharper_cpp_clang_tidy_readability_container_size_empty_highlighting = suggestion +resharper_cpp_clang_tidy_readability_convert_member_functions_to_static_highlighting = none +resharper_cpp_clang_tidy_readability_delete_null_pointer_highlighting = suggestion +resharper_cpp_clang_tidy_readability_duplicate_include_highlighting = none +resharper_cpp_clang_tidy_readability_else_after_return_highlighting = none +resharper_cpp_clang_tidy_readability_enum_initial_value_highlighting = suggestion +resharper_cpp_clang_tidy_readability_function_cognitive_complexity_highlighting = none +resharper_cpp_clang_tidy_readability_function_size_highlighting = none +resharper_cpp_clang_tidy_readability_identifier_length_highlighting = none +resharper_cpp_clang_tidy_readability_identifier_naming_highlighting = none +resharper_cpp_clang_tidy_readability_implicit_bool_conversion_highlighting = none +resharper_cpp_clang_tidy_readability_inconsistent_declaration_parameter_name_highlighting = suggestion +resharper_cpp_clang_tidy_readability_isolate_declaration_highlighting = none +resharper_cpp_clang_tidy_readability_magic_numbers_highlighting = none +resharper_cpp_clang_tidy_readability_make_member_function_const_highlighting = none +resharper_cpp_clang_tidy_readability_math_missing_parentheses_highlighting = none +resharper_cpp_clang_tidy_readability_misleading_indentation_highlighting = none +resharper_cpp_clang_tidy_readability_misplaced_array_index_highlighting = suggestion +resharper_cpp_clang_tidy_readability_named_parameter_highlighting = none +resharper_cpp_clang_tidy_readability_non_const_parameter_highlighting = none +resharper_cpp_clang_tidy_readability_operators_representation_highlighting = suggestion +resharper_cpp_clang_tidy_readability_qualified_auto_highlighting = none +resharper_cpp_clang_tidy_readability_redundant_access_specifiers_highlighting = none +resharper_cpp_clang_tidy_readability_redundant_casting_highlighting = none +resharper_cpp_clang_tidy_readability_redundant_control_flow_highlighting = none +resharper_cpp_clang_tidy_readability_redundant_declaration_highlighting = suggestion +resharper_cpp_clang_tidy_readability_redundant_function_ptr_dereference_highlighting = suggestion +resharper_cpp_clang_tidy_readability_redundant_inline_specifier_highlighting = none +resharper_cpp_clang_tidy_readability_redundant_member_init_highlighting = none +resharper_cpp_clang_tidy_readability_redundant_preprocessor_highlighting = warning +resharper_cpp_clang_tidy_readability_redundant_smartptr_get_highlighting = suggestion +resharper_cpp_clang_tidy_readability_redundant_string_cstr_highlighting = suggestion +resharper_cpp_clang_tidy_readability_redundant_string_init_highlighting = suggestion +resharper_cpp_clang_tidy_readability_reference_to_constructed_temporary_highlighting = suggestion +resharper_cpp_clang_tidy_readability_simplify_boolean_expr_highlighting = none +resharper_cpp_clang_tidy_readability_simplify_subscript_expr_highlighting = warning +resharper_cpp_clang_tidy_readability_static_accessed_through_instance_highlighting = suggestion +resharper_cpp_clang_tidy_readability_static_definition_in_anonymous_namespace_highlighting = none +resharper_cpp_clang_tidy_readability_string_compare_highlighting = warning +resharper_cpp_clang_tidy_readability_suspicious_call_argument_highlighting = warning +resharper_cpp_clang_tidy_readability_uniqueptr_delete_release_highlighting = suggestion +resharper_cpp_clang_tidy_readability_uppercase_literal_suffix_highlighting = none +resharper_cpp_clang_tidy_readability_use_anyofallof_highlighting = suggestion +resharper_cpp_clang_tidy_readability_use_concise_preprocessor_directives_highlighting = suggestion +resharper_cpp_clang_tidy_readability_use_std_min_max_highlighting = suggestion +resharper_cpp_clang_tidy_zircon_temporary_objects_highlighting = none +resharper_cpp_class_can_be_final_highlighting = none +resharper_cpp_class_is_incomplete_highlighting = warning +resharper_cpp_class_needs_constructor_because_of_uninitialized_member_highlighting = warning +resharper_cpp_class_never_used_highlighting = warning +resharper_cpp_compile_time_constant_can_be_replaced_with_boolean_constant_highlighting = suggestion +resharper_cpp_concept_never_used_highlighting = warning +resharper_cpp_conditional_expression_can_be_simplified_highlighting = suggestion +resharper_cpp_const_parameter_in_declaration_highlighting = suggestion +resharper_cpp_const_value_function_return_type_highlighting = suggestion +resharper_cpp_coroutine_call_resolve_error_highlighting = warning +resharper_cpp_cv_qualifier_can_not_be_applied_to_reference_highlighting = warning +resharper_cpp_c_style_cast_highlighting = suggestion +resharper_cpp_declaration_hides_local_highlighting = warning +resharper_cpp_declaration_hides_uncaptured_local_highlighting = hint +resharper_cpp_declaration_specifier_without_declarators_highlighting = warning +resharper_cpp_declarator_disambiguated_as_function_highlighting = warning +resharper_cpp_declarator_never_used_highlighting = warning +resharper_cpp_declarator_used_before_initialization_highlighting = error +resharper_cpp_defaulted_special_member_function_is_implicitly_deleted_highlighting = warning +resharper_cpp_default_case_not_handled_in_switch_statement_highlighting = warning +resharper_cpp_default_initialization_with_no_user_constructor_highlighting = warning +resharper_cpp_default_is_used_as_identifier_highlighting = warning +resharper_cpp_definitions_order_highlighting = hint +resharper_cpp_deleting_void_pointer_highlighting = warning +resharper_cpp_dependent_template_without_template_keyword_highlighting = warning +resharper_cpp_dependent_type_without_typename_keyword_highlighting = warning +resharper_cpp_deprecated_entity_highlighting = warning +resharper_cpp_deprecated_overriden_method_highlighting = warning +resharper_cpp_deprecated_register_storage_class_specifier_highlighting = warning +resharper_cpp_dereference_operator_limit_exceeded_highlighting = warning +resharper_cpp_discarded_postfix_operator_result_highlighting = suggestion +resharper_cpp_doxygen_syntax_error_highlighting = warning +resharper_cpp_doxygen_undocumented_parameter_highlighting = suggestion +resharper_cpp_doxygen_unresolved_reference_highlighting = warning +resharper_cpp_empty_declaration_highlighting = warning +resharper_cpp_enforce_cv_qualifiers_order_highlighting = none +resharper_cpp_enforce_cv_qualifiers_placement_highlighting = none +resharper_cpp_enforce_do_statement_braces_highlighting = none +resharper_cpp_enforce_for_statement_braces_highlighting = none +resharper_cpp_enforce_function_declaration_style_highlighting = none +resharper_cpp_enforce_if_statement_braces_highlighting = none +resharper_cpp_enforce_nested_namespaces_style_highlighting = hint +resharper_cpp_enforce_overriding_destructor_style_highlighting = suggestion +resharper_cpp_enforce_overriding_function_style_highlighting = suggestion +resharper_cpp_enforce_type_alias_code_style_highlighting = none +resharper_cpp_enforce_while_statement_braces_highlighting = none +resharper_cpp_entity_assigned_but_no_read_highlighting = warning +resharper_cpp_entity_used_only_in_unevaluated_context_highlighting = warning +resharper_cpp_enumerator_never_used_highlighting = warning +resharper_cpp_equal_operands_in_binary_expression_highlighting = warning +resharper_cpp_evaluation_failure_highlighting = error +resharper_cpp_evaluation_internal_failure_highlighting = warning +resharper_cpp_explicit_specialization_in_non_namespace_scope_highlighting = warning +resharper_cpp_expression_without_side_effects_highlighting = warning +resharper_cpp_final_function_in_final_class_highlighting = suggestion +resharper_cpp_final_non_overriding_virtual_function_highlighting = suggestion +resharper_cpp_forward_enum_declaration_without_underlying_type_highlighting = warning +resharper_cpp_for_loop_can_be_replaced_with_while_highlighting = suggestion +resharper_cpp_functional_style_cast_highlighting = suggestion +resharper_cpp_function_doesnt_return_value_highlighting = warning +resharper_cpp_function_is_not_implemented_highlighting = warning +resharper_cpp_function_result_should_be_used_highlighting = hint +resharper_cpp_header_has_been_already_included_highlighting = hint +resharper_cpp_hidden_function_highlighting = warning +resharper_cpp_hiding_function_highlighting = warning +resharper_cpp_identical_operands_in_binary_expression_highlighting = warning +resharper_cpp_if_can_be_replaced_by_constexpr_if_highlighting = suggestion +resharper_cpp_implicit_default_constructor_not_available_highlighting = warning +resharper_cpp_incompatible_pointer_conversion_highlighting = warning +resharper_cpp_incomplete_switch_statement_highlighting = warning +resharper_cpp_inconsistent_naming_highlighting = hint +resharper_cpp_incorrect_blank_lines_near_braces_highlighting = none +resharper_cpp_initialized_value_is_always_rewritten_highlighting = warning +resharper_cpp_integral_to_pointer_conversion_highlighting = warning +resharper_cpp_invalid_line_continuation_highlighting = warning +resharper_cpp_join_declaration_and_assignment_highlighting = suggestion +resharper_cpp_lambda_capture_never_used_highlighting = warning +resharper_cpp_local_variable_may_be_const_highlighting = hint +resharper_cpp_local_variable_might_not_be_initialized_highlighting = warning +resharper_cpp_local_variable_with_non_trivial_dtor_is_never_used_highlighting = none +resharper_cpp_long_float_highlighting = warning +resharper_cpp_member_function_may_be_const_highlighting = suggestion +resharper_cpp_member_function_may_be_static_highlighting = suggestion +resharper_cpp_member_initializers_order_highlighting = suggestion +resharper_cpp_mismatched_class_tags_highlighting = warning +resharper_cpp_missing_blank_lines_highlighting = none +resharper_cpp_missing_include_guard_highlighting = warning +resharper_cpp_missing_indent_highlighting = none +resharper_cpp_missing_keyword_throw_highlighting = warning +resharper_cpp_missing_linebreak_highlighting = none +resharper_cpp_missing_space_highlighting = none +resharper_cpp_module_partition_with_several_partition_units_highlighting = warning +resharper_cpp_ms_ext_address_of_class_r_value_highlighting = warning +resharper_cpp_ms_ext_binding_r_value_to_lvalue_reference_highlighting = warning +resharper_cpp_ms_ext_copy_elision_in_copy_init_declarator_highlighting = warning +resharper_cpp_ms_ext_double_user_conversion_in_copy_init_highlighting = warning +resharper_cpp_ms_ext_not_initialized_static_const_local_var_highlighting = warning +resharper_cpp_ms_ext_reinterpret_cast_from_nullptr_highlighting = warning +resharper_cpp_multiple_spaces_highlighting = none +resharper_cpp_multi_character_literal_highlighting = warning +resharper_cpp_multi_character_wide_literal_highlighting = warning +resharper_cpp_must_be_public_virtual_to_implement_interface_highlighting = warning +resharper_cpp_mutable_specifier_on_reference_member_highlighting = warning +resharper_cpp_nodiscard_function_without_return_value_highlighting = warning +resharper_cpp_non_exception_safe_resource_acquisition_highlighting = hint +resharper_cpp_non_explicit_conversion_operator_highlighting = hint +resharper_cpp_non_explicit_converting_constructor_highlighting = hint +resharper_cpp_non_inline_function_definition_in_header_file_highlighting = warning +resharper_cpp_non_inline_variable_definition_in_header_file_highlighting = warning +resharper_cpp_not_all_paths_return_value_highlighting = warning +resharper_cpp_no_discard_expression_highlighting = warning +resharper_cpp_object_member_might_not_be_initialized_highlighting = warning +resharper_cpp_outdent_is_off_prev_level_highlighting = none +resharper_cpp_out_parameter_must_be_written_highlighting = warning +resharper_cpp_parameter_may_be_const_highlighting = hint +resharper_cpp_parameter_may_be_const_ptr_or_ref_highlighting = suggestion +resharper_cpp_parameter_names_mismatch_highlighting = hint +resharper_cpp_parameter_never_used_highlighting = hint +resharper_cpp_parameter_value_is_reassigned_highlighting = warning +resharper_cpp_pass_value_parameter_by_const_reference_highlighting = suggestion +resharper_cpp_pointer_conversion_drops_qualifiers_highlighting = warning +resharper_cpp_pointer_to_integral_conversion_highlighting = warning +resharper_cpp_polymorphic_class_with_non_virtual_public_destructor_highlighting = warning +resharper_cpp_possibly_erroneous_empty_statements_highlighting = warning +resharper_cpp_possibly_uninitialized_member_highlighting = warning +resharper_cpp_possibly_unintended_object_slicing_highlighting = warning +resharper_cpp_precompiled_header_is_not_included_highlighting = error +resharper_cpp_precompiled_header_not_found_highlighting = error +resharper_cpp_printf_bad_format_highlighting = warning +resharper_cpp_printf_extra_arg_highlighting = warning +resharper_cpp_printf_missed_arg_highlighting = error +resharper_cpp_printf_risky_format_highlighting = warning +resharper_cpp_private_special_member_function_is_not_implemented_highlighting = warning +resharper_cpp_range_based_for_incompatible_reference_highlighting = warning +resharper_cpp_redefinition_of_default_argument_in_override_function_highlighting = warning +resharper_cpp_redundant_access_specifier_highlighting = hint +resharper_cpp_redundant_base_class_access_specifier_highlighting = hint +resharper_cpp_redundant_base_class_initializer_highlighting = suggestion +resharper_cpp_redundant_blank_lines_highlighting = none +resharper_cpp_redundant_boolean_expression_argument_highlighting = warning +resharper_cpp_redundant_cast_expression_highlighting = hint +resharper_cpp_redundant_complexity_in_comparison_highlighting = suggestion +resharper_cpp_redundant_conditional_expression_highlighting = suggestion +resharper_cpp_redundant_const_specifier_highlighting = hint +resharper_cpp_redundant_control_flow_jump_highlighting = hint +resharper_cpp_redundant_dereferencing_and_taking_address_highlighting = suggestion +resharper_cpp_redundant_elaborated_type_specifier_highlighting = hint +resharper_cpp_redundant_else_keyword_highlighting = hint +resharper_cpp_redundant_else_keyword_inside_compound_statement_highlighting = hint +resharper_cpp_redundant_empty_declaration_highlighting = hint +resharper_cpp_redundant_empty_statement_highlighting = hint +resharper_cpp_redundant_export_keyword_highlighting = warning +resharper_cpp_redundant_fwd_class_or_enum_specifier_highlighting = suggestion +resharper_cpp_redundant_inline_specifier_highlighting = hint +resharper_cpp_redundant_lambda_parameter_list_highlighting = hint +resharper_cpp_redundant_linebreak_highlighting = none +resharper_cpp_redundant_member_initializer_highlighting = suggestion +resharper_cpp_redundant_namespace_definition_highlighting = suggestion +resharper_cpp_redundant_parentheses_highlighting = hint +resharper_cpp_redundant_qualifier_adl_highlighting = none +resharper_cpp_redundant_qualifier_highlighting = hint +resharper_cpp_redundant_space_highlighting = none +resharper_cpp_redundant_static_specifier_on_member_allocation_function_highlighting = hint +resharper_cpp_redundant_static_specifier_on_thread_local_local_variable_highlighting = hint +resharper_cpp_redundant_template_arguments_highlighting = hint +resharper_cpp_redundant_template_keyword_highlighting = warning +resharper_cpp_redundant_typename_keyword_highlighting = warning +resharper_cpp_redundant_void_argument_list_highlighting = suggestion +resharper_cpp_redundant_zero_initializer_in_aggregate_initialization_highlighting = suggestion +resharper_cpp_reinterpret_cast_from_void_ptr_highlighting = suggestion +resharper_cpp_remove_redundant_braces_highlighting = none +resharper_cpp_replace_memset_with_zero_initialization_highlighting = suggestion +resharper_cpp_replace_tie_with_structured_binding_highlighting = suggestion +resharper_cpp_return_no_value_in_non_void_function_highlighting = warning +resharper_cpp_smart_pointer_vs_make_function_highlighting = suggestion +resharper_cpp_some_object_members_might_not_be_initialized_highlighting = warning +resharper_cpp_special_function_without_noexcept_specification_highlighting = warning +resharper_cpp_static_assert_failure_highlighting = error +resharper_cpp_static_data_member_in_unnamed_struct_highlighting = warning +resharper_cpp_static_specifier_on_anonymous_namespace_member_highlighting = suggestion +resharper_cpp_string_literal_to_char_pointer_conversion_highlighting = warning +resharper_cpp_tabs_and_spaces_mismatch_highlighting = none +resharper_cpp_tabs_are_disallowed_highlighting = none +resharper_cpp_tabs_outside_indent_highlighting = none +resharper_cpp_template_arguments_can_be_deduced_highlighting = hint +resharper_cpp_template_parameter_never_used_highlighting = hint +resharper_cpp_template_parameter_shadowing_highlighting = warning +resharper_cpp_this_arg_member_func_delegate_ctor_is_unsuported_by_dot_net_core_highlighting = none +resharper_cpp_throw_expression_can_be_replaced_with_rethrow_highlighting = warning +resharper_cpp_too_wide_scope_highlighting = suggestion +resharper_cpp_too_wide_scope_init_statement_highlighting = hint +resharper_cpp_type_alias_never_used_highlighting = warning +resharper_cpp_ue4_blueprint_callable_function_may_be_const_highlighting = hint +resharper_cpp_ue4_blueprint_callable_function_may_be_static_highlighting = hint +resharper_cpp_ue4_coding_standard_naming_violation_warning_highlighting = hint +resharper_cpp_ue4_coding_standard_u_class_naming_violation_error_highlighting = error +resharper_cpp_ue4_probable_memory_issues_with_u_objects_in_container_highlighting = warning +resharper_cpp_ue4_probable_memory_issues_with_u_object_highlighting = warning +resharper_cpp_ue_blueprint_callable_function_unused_highlighting = warning +resharper_cpp_ue_blueprint_implementable_event_not_implemented_highlighting = warning +resharper_cpp_ue_incorrect_engine_directory_highlighting = error +resharper_cpp_ue_missing_struct_member_highlighting = error +resharper_cpp_ue_missing_super_call_highlighting = warning +resharper_cpp_ue_non_existent_input_action_highlighting = warning +resharper_cpp_ue_non_existent_input_axis_highlighting = warning +resharper_cpp_ue_source_file_without_predefined_macros_highlighting = warning +resharper_cpp_ue_source_file_without_standard_library_highlighting = error +resharper_cpp_ue_version_file_doesnt_exist_highlighting = error +resharper_cpp_uninitialized_dependent_base_class_highlighting = warning +resharper_cpp_uninitialized_non_static_data_member_highlighting = warning +resharper_cpp_union_member_of_reference_type_highlighting = warning +resharper_cpp_unmatched_pragma_end_region_directive_highlighting = warning +resharper_cpp_unmatched_pragma_region_directive_highlighting = warning +resharper_cpp_unnamed_namespace_in_header_file_highlighting = warning +resharper_cpp_unnecessary_whitespace_highlighting = none +resharper_cpp_unreachable_code_highlighting = warning +resharper_cpp_unsigned_zero_comparison_highlighting = warning +resharper_cpp_unused_include_directive_highlighting = warning +resharper_cpp_user_defined_literal_suffix_does_not_start_with_underscore_highlighting = warning +resharper_cpp_use_algorithm_with_count_highlighting = suggestion +resharper_cpp_use_associative_contains_highlighting = suggestion +resharper_cpp_use_auto_for_numeric_highlighting = hint +resharper_cpp_use_auto_highlighting = hint +resharper_cpp_use_elements_view_highlighting = suggestion +resharper_cpp_use_erase_algorithm_highlighting = suggestion +resharper_cpp_use_familiar_template_syntax_for_generic_lambdas_highlighting = suggestion +resharper_cpp_use_of_undeclared_class_highlighting = hint +resharper_cpp_use_range_algorithm_highlighting = suggestion +resharper_cpp_use_std_size_highlighting = suggestion +resharper_cpp_use_structured_binding_highlighting = hint +resharper_cpp_use_type_trait_alias_highlighting = suggestion +resharper_cpp_using_result_of_assignment_as_condition_highlighting = warning +resharper_cpp_u_function_macro_call_has_no_effect_highlighting = warning +resharper_cpp_u_property_macro_call_has_no_effect_highlighting = warning +resharper_cpp_variable_can_be_made_constexpr_highlighting = suggestion +resharper_cpp_virtual_function_call_inside_ctor_highlighting = warning +resharper_cpp_virtual_function_in_final_class_highlighting = warning +resharper_cpp_volatile_parameter_in_declaration_highlighting = suggestion +resharper_cpp_warning_directive_highlighting = warning +resharper_cpp_wrong_includes_order_highlighting = hint +resharper_cpp_wrong_indent_size_highlighting = none +resharper_cpp_wrong_slashes_in_include_directive_highlighting = hint +resharper_cpp_zero_constant_can_be_replaced_with_nullptr_highlighting = suggestion +resharper_cpp_zero_valued_expression_used_as_null_pointer_highlighting = warning +resharper_cqrs_debug_highlighting = warning +resharper_cqrs_naming_recommendation_highlighting = warning +resharper_c_declaration_with_implicit_int_type_highlighting = warning +resharper_c_sharp14_overload_resolution_with_span_breaking_change_highlighting = suggestion +resharper_c_sharp_build_cs_invalid_module_name_highlighting = warning +resharper_c_sharp_missing_plugin_dependency_highlighting = warning +resharper_default_struct_equality_is_used_global_highlighting = warning +resharper_default_struct_equality_is_used_local_highlighting = warning +resharper_default_value_attribute_for_optional_parameter_highlighting = warning +resharper_dispose_on_using_variable_highlighting = warning +resharper_double_negation_in_pattern_highlighting = suggestion +resharper_double_negation_operator_highlighting = suggestion +resharper_duplicated_chained_if_bodies_highlighting = hint +resharper_duplicated_sequential_if_bodies_highlighting = hint +resharper_duplicated_statements_highlighting = warning +resharper_duplicated_switch_expression_arms_highlighting = hint +resharper_duplicated_switch_section_bodies_highlighting = hint +resharper_duplicate_item_in_logger_template_highlighting = warning +resharper_duplicate_key_collection_initialization_highlighting = warning +resharper_duplicate_resource_highlighting = warning +resharper_empty_constructor_highlighting = warning +resharper_empty_destructor_highlighting = warning +resharper_empty_extension_block_highlighting = warning +resharper_empty_for_statement_highlighting = warning +resharper_empty_general_catch_clause_highlighting = warning +resharper_empty_namespace_highlighting = warning +resharper_empty_region_highlighting = suggestion +resharper_empty_statement_highlighting = warning +resharper_empty_title_tag_highlighting = hint +resharper_entity_framework_client_side_db_function_call_highlighting = warning +resharper_entity_framework_model_validation_circular_dependency_highlighting = hint +resharper_entity_framework_model_validation_unlimited_string_length_highlighting = warning +resharper_entity_framework_n_plus_one_incomplete_data_query_highlighting = suggestion +resharper_entity_framework_n_plus_one_incomplete_data_usage_highlighting = warning +resharper_entity_framework_n_plus_one_query_highlighting = suggestion +resharper_entity_framework_n_plus_one_usage_highlighting = warning +resharper_entity_framework_unsupported_server_side_function_call_highlighting = warning +resharper_entity_name_captured_only_global_highlighting = warning +resharper_entity_name_captured_only_local_highlighting = warning +resharper_enumerable_sum_in_explicit_unchecked_context_highlighting = warning +resharper_enum_underlying_type_is_int_highlighting = warning +resharper_equal_expression_comparison_highlighting = warning +resharper_escaped_keyword_highlighting = warning +resharper_event_never_invoked_global_highlighting = suggestion +resharper_event_never_subscribed_to_global_highlighting = suggestion +resharper_event_never_subscribed_to_local_highlighting = suggestion +resharper_event_unsubscription_via_anonymous_delegate_highlighting = warning +resharper_explicit_caller_info_argument_highlighting = warning +resharper_expression_is_always_null_highlighting = warning +resharper_extract_common_branching_code_highlighting = hint +resharper_extract_common_property_pattern_highlighting = hint +resharper_field_can_be_made_read_only_global_highlighting = suggestion +resharper_field_can_be_made_read_only_local_highlighting = suggestion +resharper_field_hides_interface_property_with_default_implementation_highlighting = warning +resharper_foreach_can_be_converted_to_query_using_another_get_enumerator_highlighting = hint +resharper_foreach_can_be_partly_converted_to_query_using_another_get_enumerator_highlighting = hint +resharper_format_specifier_captures_right_braces_highlighting = warning +resharper_format_string_placeholders_mismatch_highlighting = warning +resharper_format_string_problem_highlighting = warning +resharper_for_can_be_converted_to_foreach_highlighting = suggestion +resharper_for_statement_condition_is_true_highlighting = warning +resharper_function_complexity_overflow_highlighting = none +resharper_function_never_returns_highlighting = warning +resharper_function_recursive_on_all_paths_highlighting = warning +resharper_f_sharp_builtin_function_reimplementation_highlighting = hint +resharper_f_sharp_cons_with_empty_list_pat_highlighting = suggestion +resharper_f_sharp_dot_lambda_can_be_used_highlighting = hint +resharper_f_sharp_expression_can_be_replaced_with_condition_highlighting = hint +resharper_f_sharp_interpolated_string_highlighting = suggestion +resharper_f_sharp_lambda_can_be_replaced_with_inner_expression_highlighting = hint +resharper_f_sharp_lambda_can_be_simplified_highlighting = hint +resharper_f_sharp_redundant_application_highlighting = warning +resharper_f_sharp_redundant_as_pattern_highlighting = warning +resharper_f_sharp_redundant_attribute_parens_highlighting = warning +resharper_f_sharp_redundant_attribute_suffix_highlighting = warning +resharper_f_sharp_redundant_backticks_highlighting = warning +resharper_f_sharp_redundant_dot_in_indexer_highlighting = warning +resharper_f_sharp_redundant_name_qualifier_highlighting = warning +resharper_f_sharp_redundant_new_highlighting = warning +resharper_f_sharp_redundant_open_highlighting = warning +resharper_f_sharp_redundant_parens_highlighting = warning +resharper_f_sharp_redundant_require_qualified_access_attribute_highlighting = warning +resharper_f_sharp_redundant_string_interpolation_highlighting = suggestion +resharper_f_sharp_redundant_union_case_field_patterns_highlighting = warning +resharper_f_sharp_use_wild_self_id_highlighting = suggestion +resharper_gc_suppress_finalize_for_type_without_destructor_highlighting = warning +resharper_generic_enumerator_not_disposed_highlighting = warning +resharper_godot_missing_parameterless_constructor_highlighting = warning +resharper_heuristic_unreachable_code_highlighting = warning +resharper_html_attributes_quotes_highlighting = hint +resharper_html_attribute_not_resolved_highlighting = warning +resharper_html_attribute_value_not_resolved_highlighting = warning +resharper_html_dead_code_highlighting = warning +resharper_html_event_not_resolved_highlighting = warning +resharper_html_id_duplication_highlighting = warning +resharper_html_id_not_resolved_highlighting = warning +resharper_html_obsolete_highlighting = warning +resharper_html_path_error_highlighting = warning +resharper_html_tag_not_closed_highlighting = error +resharper_html_tag_not_resolved_highlighting = warning +resharper_html_tag_should_be_self_closed_highlighting = warning +resharper_html_tag_should_not_be_self_closed_highlighting = warning +resharper_html_warning_highlighting = warning +resharper_if_std_is_constant_evaluated_can_be_replaced_highlighting = suggestion +resharper_ignored_directive_highlighting = warning +resharper_inactive_preprocessor_branch_highlighting = warning +resharper_inconsistently_synchronized_field_highlighting = warning +resharper_inconsistent_naming_highlighting = warning +resharper_inconsistent_order_of_locks_highlighting = warning +resharper_incorrect_blank_lines_near_braces_highlighting = none +resharper_incorrect_constant_expected_annotation_highlighting = error +resharper_indexing_by_invalid_range_highlighting = warning +resharper_inheritdoc_consider_usage_highlighting = none +resharper_inheritdoc_invalid_usage_highlighting = warning +resharper_inline_out_variable_declaration_highlighting = suggestion +resharper_inline_temporary_variable_highlighting = hint +resharper_internal_or_private_member_not_documented_highlighting = none +resharper_interpolated_string_expression_is_not_i_formattable_highlighting = warning +resharper_introduce_optional_parameters_global_highlighting = suggestion +resharper_introduce_optional_parameters_local_highlighting = suggestion +resharper_int_division_by_zero_highlighting = warning +resharper_int_variable_overflow_highlighting = warning +resharper_int_variable_overflow_in_checked_context_highlighting = warning +resharper_int_variable_overflow_in_unchecked_context_highlighting = warning +resharper_invalid_value_type_highlighting = warning +resharper_invalid_xml_doc_comment_highlighting = warning +resharper_invert_condition_1_highlighting = hint +resharper_invert_if_highlighting = hint +resharper_invocation_is_skipped_highlighting = hint +resharper_invoke_as_extension_method_highlighting = suggestion +resharper_in_parameter_with_must_dispose_resource_attribute_highlighting = warning +resharper_is_expression_always_false_highlighting = warning +resharper_is_expression_always_true_highlighting = warning +resharper_iterator_method_result_is_ignored_highlighting = warning +resharper_iterator_never_returns_highlighting = warning +resharper_join_declaration_and_initializer_highlighting = suggestion +resharper_join_null_check_with_usage_highlighting = suggestion +resharper_lambda_expression_can_be_made_static_highlighting = none +resharper_lambda_expression_must_be_static_highlighting = suggestion +resharper_lambda_should_not_capture_context_highlighting = warning +resharper_localizable_element_highlighting = warning +resharper_local_function_can_be_made_static_highlighting = none +resharper_local_function_hides_method_highlighting = warning +resharper_local_variable_hides_member_highlighting = warning +resharper_local_variable_hides_primary_constructor_parameter_highlighting = warning +resharper_long_literal_ending_lower_l_highlighting = warning +resharper_loop_can_be_converted_to_query_highlighting = hint +resharper_loop_can_be_partly_converted_to_query_highlighting = none +resharper_loop_variable_is_never_changed_inside_loop_highlighting = warning +resharper_math_abs_method_is_redundant_highlighting = warning +resharper_math_clamp_min_greater_than_max_highlighting = warning +resharper_meaningless_default_parameter_value_highlighting = warning +resharper_member_can_be_file_local_highlighting = none +resharper_member_can_be_internal_highlighting = none +resharper_member_can_be_made_static_global_highlighting = hint +resharper_member_can_be_made_static_local_highlighting = hint +resharper_member_can_be_private_global_highlighting = suggestion +resharper_member_can_be_private_local_highlighting = suggestion +resharper_member_can_be_protected_global_highlighting = suggestion +resharper_member_can_be_protected_local_highlighting = suggestion +resharper_member_hides_interface_member_with_default_implementation_highlighting = warning +resharper_member_hides_static_from_outer_class_highlighting = warning +resharper_member_initializer_value_ignored_highlighting = warning +resharper_merge_and_pattern_highlighting = suggestion +resharper_merge_cast_with_type_check_highlighting = suggestion +resharper_merge_conditional_expression_highlighting = suggestion +resharper_merge_into_logical_pattern_highlighting = hint +resharper_merge_into_negated_pattern_highlighting = hint +resharper_merge_into_pattern_highlighting = suggestion +resharper_merge_nested_property_patterns_highlighting = suggestion +resharper_merge_sequential_checks_highlighting = hint +resharper_method_has_async_overload_highlighting = suggestion +resharper_method_has_async_overload_with_cancellation_highlighting = suggestion +resharper_method_overload_with_optional_parameter_highlighting = warning +resharper_method_supports_cancellation_highlighting = suggestion +resharper_misleading_body_like_statement_highlighting = warning +resharper_mismatched_asmdef_filename_highlighting = suggestion +resharper_missing_alt_attribute_in_img_tag_highlighting = hint +resharper_missing_blank_lines_highlighting = none +resharper_missing_body_tag_highlighting = warning +resharper_missing_head_and_body_tags_highlighting = warning +resharper_missing_head_tag_highlighting = warning +resharper_missing_indent_highlighting = none +resharper_missing_linebreak_highlighting = none +resharper_missing_space_highlighting = none +resharper_more_specific_foreach_variable_type_available_highlighting = suggestion +resharper_move_local_function_after_jump_statement_highlighting = hint +resharper_move_to_existing_positional_deconstruction_pattern_highlighting = hint +resharper_move_to_extension_block_highlighting = hint +resharper_move_variable_declaration_inside_loop_condition_highlighting = suggestion +resharper_multiple_cqrs_entity_highlighting = warning +resharper_multiple_nullable_attributes_usage_highlighting = warning +resharper_multiple_order_by_highlighting = warning +resharper_multiple_resolve_candidates_in_text_highlighting = warning +resharper_multiple_spaces_highlighting = none +resharper_multiple_statements_on_one_line_highlighting = none +resharper_multiple_type_members_on_one_line_highlighting = none +resharper_must_use_return_value_highlighting = warning +resharper_mvc_action_not_resolved_highlighting = warning +resharper_mvc_area_not_resolved_highlighting = warning +resharper_mvc_controller_not_resolved_highlighting = warning +resharper_mvc_invalid_model_type_highlighting = error +resharper_mvc_masterpage_not_resolved_highlighting = warning +resharper_mvc_partial_view_not_resolved_highlighting = warning +resharper_mvc_template_not_resolved_highlighting = warning +resharper_mvc_view_component_not_resolved_highlighting = warning +resharper_mvc_view_component_view_not_resolved_highlighting = warning +resharper_mvc_view_not_resolved_highlighting = warning +resharper_negation_of_relational_pattern_highlighting = suggestion +resharper_negative_equality_expression_highlighting = suggestion +resharper_negative_index_highlighting = warning +resharper_nested_record_update_can_be_simplified_highlighting = suggestion +resharper_nested_string_interpolation_highlighting = suggestion +resharper_non_atomic_compound_operator_highlighting = warning +resharper_non_constant_equality_expression_has_constant_result_highlighting = warning +resharper_non_parsable_element_highlighting = warning +resharper_non_readonly_member_in_get_hash_code_highlighting = warning +resharper_non_volatile_field_in_double_check_locking_highlighting = warning +resharper_not_accessed_field_global_highlighting = suggestion +resharper_not_accessed_field_local_highlighting = warning +resharper_not_accessed_out_parameter_variable_highlighting = warning +resharper_not_accessed_positional_property_global_highlighting = warning +resharper_not_accessed_positional_property_local_highlighting = warning +resharper_not_accessed_variable_highlighting = warning +resharper_not_assigned_out_parameter_highlighting = warning +resharper_not_declared_in_parent_culture_highlighting = warning +resharper_not_disposed_resource_highlighting = warning +resharper_not_disposed_resource_is_returned_by_property_highlighting = warning +resharper_not_disposed_resource_is_returned_highlighting = suggestion +resharper_not_null_or_required_member_is_not_initialized_highlighting = warning +resharper_not_observable_annotation_redundancy_highlighting = warning +resharper_not_overridden_in_specific_culture_highlighting = warning +resharper_not_resolved_in_text_highlighting = warning +resharper_no_support_for_vb_highlighting = warning +resharper_nullable_warning_suppression_is_used_highlighting = none +resharper_nullness_annotation_conflict_with_jet_brains_annotations_highlighting = warning +resharper_null_coalescing_condition_is_always_not_null_according_to_api_contract_highlighting = warning +resharper_n_unit_async_method_must_be_task_highlighting = warning +resharper_n_unit_attribute_produces_too_many_tests_highlighting = none +resharper_n_unit_auto_fixture_incorrect_argument_type_highlighting = warning +resharper_n_unit_auto_fixture_missed_test_attribute_highlighting = warning +resharper_n_unit_auto_fixture_missed_test_or_test_fixture_attribute_highlighting = warning +resharper_n_unit_auto_fixture_redundant_argument_in_inline_auto_data_attribute_highlighting = warning +resharper_n_unit_duplicate_values_highlighting = warning +resharper_n_unit_ignored_parameter_attribute_highlighting = warning +resharper_n_unit_implicit_unspecified_null_values_highlighting = warning +resharper_n_unit_incorrect_argument_type_highlighting = warning +resharper_n_unit_incorrect_expected_result_type_highlighting = warning +resharper_n_unit_incorrect_range_bounds_highlighting = warning +resharper_n_unit_method_with_parameters_and_test_attribute_highlighting = warning +resharper_n_unit_missing_arguments_in_test_case_attribute_highlighting = warning +resharper_n_unit_missing_cancel_after_attribute_highlighting = warning +resharper_n_unit_non_public_method_with_test_attribute_highlighting = warning +resharper_n_unit_no_values_provided_highlighting = warning +resharper_n_unit_parameter_type_is_not_compatible_with_attribute_highlighting = warning +resharper_n_unit_range_attribute_bounds_are_out_of_range_highlighting = warning +resharper_n_unit_range_step_sign_mismatch_highlighting = warning +resharper_n_unit_range_step_value_must_not_be_zero_highlighting = warning +resharper_n_unit_range_to_value_is_not_reachable_highlighting = warning +resharper_n_unit_redundant_argument_instead_of_expected_result_highlighting = warning +resharper_n_unit_redundant_argument_in_test_case_attribute_highlighting = warning +resharper_n_unit_redundant_expected_result_in_test_case_attribute_highlighting = warning +resharper_n_unit_test_case_attribute_requires_expected_result_highlighting = warning +resharper_n_unit_test_case_result_property_duplicates_expected_result_highlighting = warning +resharper_n_unit_test_case_result_property_is_obsolete_highlighting = warning +resharper_n_unit_test_case_source_must_be_field_property_method_highlighting = warning +resharper_n_unit_test_case_source_must_be_static_highlighting = warning +resharper_n_unit_test_case_source_should_implement_i_enumerable_highlighting = warning +resharper_object_creation_as_statement_highlighting = warning +resharper_obsolete_element_error_highlighting = error +resharper_obsolete_element_highlighting = warning +resharper_odin_odin_member_present_in_multiple_groups_highlighting = warning +resharper_odin_odin_member_wrong_grouping_attribute_highlighting = warning +resharper_odin_odin_unknown_grouping_path_highlighting = warning +resharper_one_way_operation_contract_with_return_type_highlighting = warning +resharper_operation_contract_without_service_contract_highlighting = warning +resharper_operator_is_can_be_used_highlighting = warning +resharper_operator_without_matched_checked_operator_highlighting = warning +resharper_optional_parameter_hierarchy_mismatch_highlighting = warning +resharper_optional_parameter_ref_out_highlighting = warning +resharper_other_tags_inside_script1_highlighting = error +resharper_other_tags_inside_script2_highlighting = error +resharper_other_tags_inside_unclosed_script_highlighting = error +resharper_outdent_is_off_prev_level_highlighting = none +resharper_out_parameter_value_is_always_discarded_global_highlighting = suggestion +resharper_out_parameter_value_is_always_discarded_local_highlighting = warning +resharper_out_parameter_with_handles_resource_disposal_attribute_highlighting = warning +resharper_overridden_with_empty_value_highlighting = warning +resharper_overridden_with_same_value_highlighting = suggestion +resharper_parameter_hides_member_highlighting = warning +resharper_parameter_hides_primary_constructor_parameter_highlighting = warning +resharper_parameter_only_used_for_precondition_check_global_highlighting = suggestion +resharper_parameter_only_used_for_precondition_check_local_highlighting = warning +resharper_parameter_type_can_be_enumerable_global_highlighting = none +resharper_parameter_type_can_be_enumerable_local_highlighting = none +resharper_partial_method_parameter_name_mismatch_highlighting = warning +resharper_partial_method_with_single_part_highlighting = warning +resharper_partial_type_with_single_part_highlighting = warning +resharper_pass_string_interpolation_highlighting = hint +resharper_pattern_always_matches_highlighting = warning +resharper_pattern_is_always_true_or_false_highlighting = warning +resharper_pattern_is_redundant_highlighting = warning +resharper_pattern_never_matches_highlighting = warning +resharper_place_assignment_expression_into_block_highlighting = none +resharper_polymorphic_field_like_event_invocation_highlighting = warning +resharper_possible_infinite_inheritance_highlighting = warning +resharper_possible_intended_rethrow_highlighting = warning +resharper_possible_interface_member_ambiguity_highlighting = warning +resharper_possible_invalid_cast_exception_highlighting = warning +resharper_possible_invalid_cast_exception_in_foreach_loop_highlighting = warning +resharper_possible_invalid_operation_exception_collection_was_modified_highlighting = warning +resharper_possible_invalid_operation_exception_highlighting = warning +resharper_possible_loss_of_fraction_highlighting = warning +resharper_possible_mistaken_call_to_get_type_highlighting = warning +resharper_possible_mistaken_system_type_argument_highlighting = warning +resharper_possible_multiple_enumeration_highlighting = warning +resharper_possible_multiple_write_access_in_double_check_locking_highlighting = warning +resharper_possible_null_reference_exception_highlighting = warning +resharper_possible_struct_member_modification_of_non_variable_struct_highlighting = warning +resharper_possible_unintended_linear_search_in_set_highlighting = warning +resharper_possible_unintended_queryable_as_enumerable_highlighting = suggestion +resharper_possible_unintended_reference_comparison_highlighting = warning +resharper_possible_write_to_me_highlighting = warning +resharper_possibly_impure_method_call_on_readonly_variable_highlighting = warning +resharper_possibly_missing_indexer_initializer_comma_highlighting = warning +resharper_possibly_mistaken_use_of_cancellation_token_highlighting = warning +resharper_possibly_mistaken_use_of_interpolated_string_insert_highlighting = warning +resharper_possibly_unintended_side_effects_inside_conditional_invocation_highlighting = warning +resharper_possibly_unintended_usage_parameterless_get_expression_type_highlighting = error +resharper_prefer_concrete_value_over_default_highlighting = suggestion +resharper_prefer_explicitly_provided_tuple_component_name_highlighting = hint +resharper_primary_constructor_parameter_capture_disallowed_highlighting = none +resharper_private_field_can_be_converted_to_local_variable_highlighting = warning +resharper_property_can_be_made_init_only_global_highlighting = suggestion +resharper_property_can_be_made_init_only_local_highlighting = suggestion +resharper_property_field_keyword_is_never_assigned_highlighting = warning +resharper_property_field_keyword_is_never_used_highlighting = warning +resharper_property_not_resolved_highlighting = error +resharper_public_constructor_in_abstract_class_highlighting = suggestion +resharper_pure_attribute_on_void_method_highlighting = warning +resharper_query_invasion_declaration_global_highlighting = warning +resharper_query_invasion_usage_global_highlighting = warning +resharper_raw_string_can_be_simplified_highlighting = hint +resharper_razor_assembly_not_resolved_highlighting = warning +resharper_razor_layout_not_resolved_highlighting = error +resharper_razor_null_conditional_operator_highlighting_highlighting = warning +resharper_razor_section_not_resolved_highlighting = error +resharper_razor_unresolved_component_highlighting = warning +resharper_read_access_in_double_check_locking_highlighting = warning +resharper_redundant_abstract_modifier_highlighting = warning +resharper_redundant_accessor_body_highlighting = suggestion +resharper_redundant_always_match_subpattern_highlighting = suggestion +resharper_redundant_anonymous_type_property_name_highlighting = warning +resharper_redundant_argument_default_value_highlighting = warning +resharper_redundant_array_creation_expression_highlighting = hint +resharper_redundant_array_lower_bound_specification_highlighting = warning +resharper_redundant_assignment_highlighting = warning +resharper_redundant_attribute_parentheses_highlighting = hint +resharper_redundant_attribute_suffix_highlighting = warning +resharper_redundant_attribute_usage_property_highlighting = suggestion +resharper_redundant_base_constructor_call_highlighting = warning +resharper_redundant_base_qualifier_highlighting = warning +resharper_redundant_blank_lines_highlighting = none +resharper_redundant_bool_compare_highlighting = warning +resharper_redundant_caller_argument_expression_default_value_highlighting = warning +resharper_redundant_case_label_highlighting = warning +resharper_redundant_cast_highlighting = warning +resharper_redundant_catch_clause_highlighting = warning +resharper_redundant_check_before_assignment_highlighting = warning +resharper_redundant_collection_copy_call_highlighting = warning +resharper_redundant_collection_initializer_element_braces_highlighting = hint +resharper_redundant_configure_await_highlighting = suggestion +resharper_redundant_cqrs_attribute_highlighting = warning +resharper_redundant_declaration_semicolon_highlighting = hint +resharper_redundant_default_member_initializer_highlighting = warning +resharper_redundant_delegate_creation_highlighting = warning +resharper_redundant_dictionary_contains_key_before_adding_highlighting = warning +resharper_redundant_disable_warning_comment_highlighting = warning +resharper_redundant_discard_designation_highlighting = suggestion +resharper_redundant_empty_case_else_highlighting = warning +resharper_redundant_empty_finally_block_highlighting = warning +resharper_redundant_empty_object_creation_argument_list_highlighting = hint +resharper_redundant_empty_object_or_collection_initializer_highlighting = warning +resharper_redundant_empty_switch_section_highlighting = warning +resharper_redundant_enumerable_cast_call_highlighting = warning +resharper_redundant_enum_case_label_for_default_section_highlighting = none +resharper_redundant_explicit_array_creation_highlighting = warning +resharper_redundant_explicit_array_size_highlighting = warning +resharper_redundant_explicit_nullable_creation_highlighting = warning +resharper_redundant_explicit_params_array_creation_highlighting = suggestion +resharper_redundant_explicit_positional_property_declaration_highlighting = warning +resharper_redundant_explicit_tuple_component_name_highlighting = warning +resharper_redundant_extends_list_entry_highlighting = warning +resharper_redundant_fixed_pointer_declaration_highlighting = suggestion +resharper_redundant_if_else_block_highlighting = hint +resharper_redundant_if_statement_then_keyword_highlighting = none +resharper_redundant_immediate_delegate_invocation_highlighting = suggestion +resharper_redundant_include_highlighting = warning +resharper_redundant_is_before_relational_pattern_highlighting = suggestion +resharper_redundant_iterator_keyword_highlighting = warning +resharper_redundant_jump_statement_highlighting = warning +resharper_redundant_lambda_parameter_type_highlighting = warning +resharper_redundant_lambda_signature_parentheses_highlighting = hint +resharper_redundant_linebreak_highlighting = none +resharper_redundant_logical_conditional_expression_operand_highlighting = warning +resharper_redundant_me_qualifier_highlighting = warning +resharper_redundant_my_base_qualifier_highlighting = warning +resharper_redundant_my_class_qualifier_highlighting = warning +resharper_redundant_name_qualifier_highlighting = warning +resharper_redundant_not_null_constraint_highlighting = warning +resharper_redundant_nullable_annotation_on_reference_type_constraint_highlighting = warning +resharper_redundant_nullable_annotation_on_type_constraint_has_non_nullable_base_type_highlighting = warning +resharper_redundant_nullable_annotation_on_type_constraint_has_non_nullable_type_kind_highlighting = warning +resharper_redundant_nullable_directive_highlighting = warning +resharper_redundant_nullable_flow_attribute_highlighting = warning +resharper_redundant_nullable_type_mark_highlighting = warning +resharper_redundant_nullness_attribute_with_nullable_reference_types_highlighting = warning +resharper_redundant_overflow_checking_context_highlighting = warning +resharper_redundant_overload_global_highlighting = suggestion +resharper_redundant_overload_local_highlighting = suggestion +resharper_redundant_overridden_member_highlighting = warning +resharper_redundant_params_highlighting = warning +resharper_redundant_parentheses_highlighting = none +resharper_redundant_partial_method_empty_implementation_highlighting = warning +resharper_redundant_pattern_parentheses_highlighting = hint +resharper_redundant_property_parentheses_highlighting = hint +resharper_redundant_property_pattern_clause_highlighting = suggestion +resharper_redundant_qualifier_highlighting = warning +resharper_redundant_query_order_by_ascending_keyword_highlighting = hint +resharper_redundant_range_bound_highlighting = suggestion +resharper_redundant_readonly_modifier_highlighting = suggestion +resharper_redundant_record_class_keyword_highlighting = warning +resharper_redundant_scoped_parameter_modifier_highlighting = warning +resharper_redundant_sets_required_members_attribute_highlighting = warning +resharper_redundant_setter_value_parameter_declaration_highlighting = hint +resharper_redundant_space_highlighting = none +resharper_redundant_spread_element_highlighting = suggestion +resharper_redundant_string_format_call_highlighting = warning +resharper_redundant_string_interpolation_highlighting = suggestion +resharper_redundant_string_to_char_array_call_highlighting = warning +resharper_redundant_string_type_highlighting = suggestion +resharper_redundant_suppress_nullable_warning_expression_highlighting = warning +resharper_redundant_switch_expression_arms_highlighting = warning +resharper_redundant_ternary_expression_highlighting = warning +resharper_redundant_to_string_call_for_value_type_highlighting = hint +resharper_redundant_to_string_call_highlighting = warning +resharper_redundant_type_arguments_inside_nameof_highlighting = suggestion +resharper_redundant_type_arguments_of_method_highlighting = warning +resharper_redundant_type_check_in_pattern_highlighting = warning +resharper_redundant_type_declaration_body_highlighting = suggestion +resharper_redundant_unsafe_context_highlighting = warning +resharper_redundant_using_directive_global_highlighting = warning +resharper_redundant_using_directive_highlighting = warning +resharper_redundant_verbatim_prefix_highlighting = suggestion +resharper_redundant_verbatim_string_prefix_highlighting = suggestion +resharper_redundant_virtual_modifier_highlighting = warning +resharper_redundant_with_cancellation_highlighting = warning +resharper_redundant_with_expression_highlighting = suggestion +resharper_reference_equals_with_value_type_highlighting = warning +resharper_reg_exp_inspections_highlighting = warning +resharper_remove_constructor_invocation_highlighting = none +resharper_remove_redundant_or_statement_false_highlighting = suggestion +resharper_remove_redundant_or_statement_true_highlighting = suggestion +resharper_remove_to_list_1_highlighting = suggestion +resharper_remove_to_list_2_highlighting = suggestion +resharper_replace_async_with_task_return_highlighting = none +resharper_replace_auto_property_with_computed_property_highlighting = hint +resharper_replace_conditional_expression_with_null_coalescing_highlighting = suggestion +resharper_replace_object_pattern_with_var_pattern_highlighting = suggestion +resharper_replace_sequence_equal_with_constant_pattern_highlighting = suggestion +resharper_replace_slice_with_range_indexer_highlighting = hint +resharper_replace_substring_with_range_indexer_highlighting = hint +resharper_replace_with_field_keyword_highlighting = suggestion +resharper_replace_with_first_or_default_1_highlighting = suggestion +resharper_replace_with_first_or_default_2_highlighting = suggestion +resharper_replace_with_first_or_default_3_highlighting = suggestion +resharper_replace_with_first_or_default_4_highlighting = suggestion +resharper_replace_with_last_or_default_1_highlighting = suggestion +resharper_replace_with_last_or_default_2_highlighting = suggestion +resharper_replace_with_last_or_default_3_highlighting = suggestion +resharper_replace_with_last_or_default_4_highlighting = suggestion +resharper_replace_with_of_type_1_highlighting = suggestion +resharper_replace_with_of_type_2_highlighting = suggestion +resharper_replace_with_of_type_3_highlighting = suggestion +resharper_replace_with_of_type_any_1_highlighting = suggestion +resharper_replace_with_of_type_any_2_highlighting = suggestion +resharper_replace_with_of_type_count_1_highlighting = suggestion +resharper_replace_with_of_type_count_2_highlighting = suggestion +resharper_replace_with_of_type_first_1_highlighting = suggestion +resharper_replace_with_of_type_first_2_highlighting = suggestion +resharper_replace_with_of_type_first_or_default_1_highlighting = suggestion +resharper_replace_with_of_type_first_or_default_2_highlighting = suggestion +resharper_replace_with_of_type_last_1_highlighting = suggestion +resharper_replace_with_of_type_last_2_highlighting = suggestion +resharper_replace_with_of_type_last_or_default_1_highlighting = suggestion +resharper_replace_with_of_type_last_or_default_2_highlighting = suggestion +resharper_replace_with_of_type_long_count_highlighting = suggestion +resharper_replace_with_of_type_single_1_highlighting = suggestion +resharper_replace_with_of_type_single_2_highlighting = suggestion +resharper_replace_with_of_type_single_or_default_1_highlighting = suggestion +resharper_replace_with_of_type_single_or_default_2_highlighting = suggestion +resharper_replace_with_of_type_where_highlighting = suggestion +resharper_replace_with_primary_constructor_parameter_highlighting = suggestion +resharper_replace_with_simple_assignment_false_highlighting = suggestion +resharper_replace_with_simple_assignment_true_highlighting = suggestion +resharper_replace_with_single_assignment_false_highlighting = suggestion +resharper_replace_with_single_assignment_true_highlighting = suggestion +resharper_replace_with_single_call_to_any_highlighting = suggestion +resharper_replace_with_single_call_to_count_highlighting = suggestion +resharper_replace_with_single_call_to_first_highlighting = suggestion +resharper_replace_with_single_call_to_first_or_default_highlighting = suggestion +resharper_replace_with_single_call_to_last_highlighting = suggestion +resharper_replace_with_single_call_to_last_or_default_highlighting = suggestion +resharper_replace_with_single_call_to_single_highlighting = suggestion +resharper_replace_with_single_call_to_single_or_default_highlighting = suggestion +resharper_replace_with_single_or_default_1_highlighting = suggestion +resharper_replace_with_single_or_default_2_highlighting = suggestion +resharper_replace_with_single_or_default_3_highlighting = suggestion +resharper_replace_with_single_or_default_4_highlighting = suggestion +resharper_replace_with_string_is_null_or_empty_highlighting = suggestion +resharper_required_base_types_conflict_highlighting = warning +resharper_required_base_types_direct_conflict_highlighting = warning +resharper_required_base_types_is_not_inherited_highlighting = warning +resharper_resource_item_not_resolved_highlighting = error +resharper_resource_not_resolved_highlighting = error +resharper_resx_not_resolved_highlighting = warning +resharper_return_of_task_produced_by_using_variable_highlighting = warning +resharper_return_of_using_variable_highlighting = warning +resharper_return_type_can_be_enumerable_global_highlighting = none +resharper_return_type_can_be_enumerable_local_highlighting = none +resharper_return_type_can_be_not_nullable_highlighting = warning +resharper_return_value_of_pure_method_is_not_used_highlighting = warning +resharper_route_templates_action_route_prefix_can_be_extracted_to_controller_route_highlighting = hint +resharper_route_templates_ambiguous_matching_constraint_constructor_highlighting = warning +resharper_route_templates_constraint_argument_cannot_be_converted_highlighting = warning +resharper_route_templates_controller_route_parameter_is_not_passed_to_methods_highlighting = hint +resharper_route_templates_duplicated_parameter_highlighting = warning +resharper_route_templates_matching_constraint_constructor_not_resolved_highlighting = warning +resharper_route_templates_method_missing_route_parameters_highlighting = hint +resharper_route_templates_optional_parameter_can_be_preceded_only_by_single_period_highlighting = warning +resharper_route_templates_optional_parameter_must_be_at_the_end_of_segment_highlighting = warning +resharper_route_templates_parameter_constraint_can_be_specified_highlighting = hint +resharper_route_templates_parameter_type_and_constraints_mismatch_highlighting = warning +resharper_route_templates_parameter_type_can_be_made_stricter_highlighting = suggestion +resharper_route_templates_route_parameter_constraint_not_resolved_highlighting = warning +resharper_route_templates_route_parameter_is_not_passed_to_method_highlighting = hint +resharper_route_templates_route_token_not_resolved_highlighting = warning +resharper_route_templates_symbol_not_resolved_highlighting = warning +resharper_route_templates_syntax_error_highlighting = warning +resharper_safe_cast_is_used_as_type_check_highlighting = suggestion +resharper_script_tag_has_both_src_and_content_attributes_highlighting = error +resharper_sealed_member_in_sealed_class_highlighting = warning +resharper_separate_control_transfer_statement_highlighting = none +resharper_separate_local_functions_with_jump_statement_highlighting = hint +resharper_service_contract_without_operations_highlighting = warning +resharper_shader_lab_shader_reference_multiple_candidates_highlighting = warning +resharper_shader_lab_shader_reference_not_resolved_highlighting = warning +resharper_shebang_directive_bad_placement_highlighting = warning +resharper_shift_expression_real_shift_count_is_zero_highlighting = warning +resharper_shift_expression_result_equals_zero_highlighting = warning +resharper_shift_expression_right_operand_not_equal_real_count_highlighting = warning +resharper_shift_expression_zero_left_operand_highlighting = warning +resharper_similar_anonymous_type_nearby_highlighting = hint +resharper_simplify_conditional_operator_highlighting = suggestion +resharper_simplify_conditional_ternary_expression_highlighting = suggestion +resharper_simplify_i_if_highlighting = suggestion +resharper_simplify_linq_expression_use_all_highlighting = suggestion +resharper_simplify_linq_expression_use_any_highlighting = suggestion +resharper_simplify_string_interpolation_highlighting = suggestion +resharper_specify_a_culture_in_string_conversion_explicitly_highlighting = warning +resharper_specify_string_comparison_highlighting = hint +resharper_spin_lock_in_readonly_field_highlighting = warning +resharper_stack_alloc_inside_loop_highlighting = warning +resharper_static_member_initializer_referes_to_member_below_highlighting = warning +resharper_static_member_in_generic_type_highlighting = warning +resharper_static_problem_in_text_highlighting = warning +resharper_std_is_constant_evaluated_will_always_evaluate_to_constant_highlighting = warning +resharper_stream_read_return_value_ignored_highlighting = warning +resharper_string_compare_is_culture_specific_1_highlighting = warning +resharper_string_compare_is_culture_specific_2_highlighting = warning +resharper_string_compare_is_culture_specific_3_highlighting = warning +resharper_string_compare_is_culture_specific_4_highlighting = warning +resharper_string_compare_is_culture_specific_5_highlighting = warning +resharper_string_compare_is_culture_specific_6_highlighting = warning +resharper_string_compare_to_is_culture_specific_highlighting = warning +resharper_string_ends_with_is_culture_specific_highlighting = none +resharper_string_index_of_is_culture_specific_1_highlighting = warning +resharper_string_index_of_is_culture_specific_2_highlighting = warning +resharper_string_index_of_is_culture_specific_3_highlighting = warning +resharper_string_last_index_of_is_culture_specific_1_highlighting = warning +resharper_string_last_index_of_is_culture_specific_2_highlighting = warning +resharper_string_last_index_of_is_culture_specific_3_highlighting = warning +resharper_string_literal_as_interpolation_argument_highlighting = suggestion +resharper_string_span_comparison_highlighting = warning +resharper_string_starts_with_is_culture_specific_highlighting = none +resharper_structured_message_template_problem_highlighting = warning +resharper_struct_can_be_made_read_only_highlighting = suggestion +resharper_struct_lacks_i_equatable_global_highlighting = warning +resharper_struct_lacks_i_equatable_local_highlighting = warning +resharper_struct_member_can_be_made_read_only_highlighting = none +resharper_suggest_base_type_for_parameter_highlighting = none +resharper_suggest_base_type_for_parameter_in_constructor_highlighting = none +resharper_suggest_discard_declaration_var_style_highlighting = hint +resharper_suggest_var_or_type_built_in_types_highlighting = hint +resharper_suggest_var_or_type_deconstruction_declarations_highlighting = hint +resharper_suggest_var_or_type_elsewhere_highlighting = hint +resharper_suggest_var_or_type_simple_types_highlighting = hint +resharper_suppress_nullable_warning_expression_as_inverted_is_expression_highlighting = warning +resharper_suspicious_lock_over_synchronization_primitive_highlighting = warning +resharper_suspicious_math_sign_method_highlighting = warning +resharper_suspicious_parameter_name_in_argument_null_exception_highlighting = warning +resharper_suspicious_type_conversion_global_highlighting = warning +resharper_swap_via_deconstruction_highlighting = suggestion +resharper_switch_expression_handles_some_known_enum_values_with_exception_in_default_highlighting = hint +resharper_switch_statement_for_enum_misses_default_section_highlighting = hint +resharper_switch_statement_handles_some_known_enum_values_with_default_highlighting = hint +resharper_switch_statement_missing_some_enum_cases_no_default_highlighting = hint +resharper_symbol_from_not_copied_locally_reference_used_warning_highlighting = warning +resharper_tabs_and_spaces_mismatch_highlighting = none +resharper_tabs_are_disallowed_highlighting = none +resharper_tabs_outside_indent_highlighting = none +resharper_tail_recursive_call_highlighting = hint +resharper_thread_static_at_instance_field_highlighting = warning +resharper_thread_static_field_has_initializer_highlighting = warning +resharper_too_wide_local_variable_scope_highlighting = suggestion +resharper_try_cast_always_succeeds_highlighting = suggestion +resharper_try_statements_can_be_merged_highlighting = hint +resharper_type_parameter_can_be_variant_highlighting = suggestion +resharper_type_with_suspicious_equality_is_used_in_record_global_highlighting = warning +resharper_type_with_suspicious_equality_is_used_in_record_local_highlighting = warning +resharper_unassigned_field_global_highlighting = suggestion +resharper_unassigned_field_local_highlighting = warning +resharper_unassigned_get_only_auto_property_highlighting = warning +resharper_unassigned_readonly_field_highlighting = warning +resharper_unclosed_script_highlighting = error +resharper_unexpected_attribute_highlighting = warning +resharper_unexpected_directive_highlighting = warning +resharper_unity_burst_accessing_managed_indexer_highlighting = warning +resharper_unity_burst_accessing_managed_method_highlighting = warning +resharper_unity_burst_boxing_not_supported_highlighting = warning +resharper_unity_burst_creating_managed_type_highlighting = warning +resharper_unity_burst_debug_log_invalid_argument_highlighting = warning +resharper_unity_burst_foreach_not_supported_highlighting = warning +resharper_unity_burst_function_signature_contains_managed_types_highlighting = warning +resharper_unity_burst_loading_managed_type_highlighting = warning +resharper_unity_burst_loading_static_not_readonly_highlighting = warning +resharper_unity_burst_local_string_variable_declaration_highlighting = suggestion +resharper_unity_burst_shared_static_create_highlighting = warning +resharper_unity_burst_string_format_invalid_argument_highlighting = warning +resharper_unity_burst_string_format_invalid_format_highlighting = warning +resharper_unity_burst_try_not_supported_highlighting = warning +resharper_unity_burst_typeof_expression_highlighting = warning +resharper_unity_burst_write_static_field_highlighting = warning +resharper_unity_duplicate_event_function_highlighting = warning +resharper_unity_duplicate_shortcut_highlighting = warning +resharper_unity_entities_aspect_wrong_fields_type_highlighting = error +resharper_unity_entities_inconsistent_modifiers_for_dots_inheritor_highlighting = error +resharper_unity_entities_must_be_struct_for_dots_inheritor_highlighting = error +resharper_unity_entities_not_updated_component_lookup_highlighting = warning +resharper_unity_entities_singleton_must_be_requested_highlighting = warning +resharper_unity_expected_component_highlighting = warning +resharper_unity_expected_scriptable_object_highlighting = warning +resharper_unity_explicit_tag_comparison_highlighting = warning +resharper_unity_incorrect_method_signature_highlighting = warning +resharper_unity_incorrect_method_signature_in_string_literal_highlighting = warning +resharper_unity_incorrect_mono_behaviour_instantiation_highlighting = warning +resharper_unity_incorrect_scriptable_object_instantiation_highlighting = warning +resharper_unity_inefficient_multidimensional_array_usage_highlighting = warning +resharper_unity_inefficient_multiplication_order_highlighting = warning +resharper_unity_inefficient_property_access_highlighting = none +resharper_unity_instantiate_without_parent_highlighting = warning +resharper_unity_load_scene_ambiguous_scene_name_highlighting = warning +resharper_unity_load_scene_disabled_scene_name_highlighting = warning +resharper_unity_load_scene_unexisting_scene_highlighting = warning +resharper_unity_load_scene_unknown_scene_name_highlighting = warning +resharper_unity_load_scene_wrong_index_highlighting = warning +resharper_unity_no_null_coalescing_highlighting = none +resharper_unity_no_null_pattern_matching_highlighting = none +resharper_unity_no_null_propagation_highlighting = none +resharper_unity_parameter_not_derived_from_component_highlighting = warning +resharper_unity_performance_critical_code_camera_main_highlighting = hint +resharper_unity_performance_critical_code_invocation_highlighting = hint +resharper_unity_performance_critical_code_null_comparison_highlighting = hint +resharper_unity_possible_misapplication_of_attribute_to_multiple_fields_highlighting = warning +resharper_unity_prefer_address_by_id_to_graphics_params_highlighting = warning +resharper_unity_prefer_generic_method_overload_highlighting = warning +resharper_unity_prefer_guid_reference_highlighting = hint +resharper_unity_prefer_non_alloc_api_highlighting = warning +resharper_unity_property_drawer_on_gui_base_highlighting = warning +resharper_unity_redundant_attribute_on_target_highlighting = warning +resharper_unity_redundant_event_function_highlighting = warning +resharper_unity_redundant_formerly_serialized_as_attribute_highlighting = warning +resharper_unity_redundant_hide_in_inspector_attribute_highlighting = warning +resharper_unity_redundant_initialize_on_load_attribute_highlighting = warning +resharper_unity_redundant_serialize_field_attribute_highlighting = warning +resharper_unity_shared_static_unmanaged_type_highlighting = warning +resharper_unity_unknown_animator_state_name_highlighting = warning +resharper_unity_unknown_input_axes_highlighting = warning +resharper_unity_unknown_layer_highlighting = warning +resharper_unity_unknown_resource_highlighting = warning +resharper_unity_unknown_tag_highlighting = warning +resharper_unity_unresolved_component_or_scriptable_object_highlighting = warning +resharper_unnecessary_whitespace_highlighting = none +resharper_unreachable_switch_arm_due_to_integer_analysis_highlighting = warning +resharper_unreachable_switch_case_due_to_integer_analysis_highlighting = warning +resharper_unreal_header_tool_error_highlighting = error +resharper_unreal_header_tool_warning_highlighting = warning +resharper_unsupported_required_base_type_highlighting = warning +resharper_unused_anonymous_method_signature_highlighting = warning +resharper_unused_auto_property_accessor_global_highlighting = warning +resharper_unused_auto_property_accessor_local_highlighting = warning +resharper_unused_import_clause_highlighting = warning +resharper_unused_local_function_highlighting = warning +resharper_unused_local_function_parameter_highlighting = warning +resharper_unused_local_function_return_value_highlighting = warning +resharper_unused_member_global_highlighting = suggestion +resharper_unused_member_hierarchy_global_highlighting = suggestion +resharper_unused_member_hierarchy_local_highlighting = warning +resharper_unused_member_in_super_global_highlighting = suggestion +resharper_unused_member_in_super_local_highlighting = warning +resharper_unused_member_local_highlighting = warning +resharper_unused_method_return_value_global_highlighting = suggestion +resharper_unused_method_return_value_local_highlighting = warning +resharper_unused_nullable_directive_highlighting = warning +resharper_unused_parameter_global_highlighting = suggestion +resharper_unused_parameter_in_partial_method_highlighting = warning +resharper_unused_parameter_local_highlighting = warning +resharper_unused_tuple_component_in_return_value_highlighting = warning +resharper_unused_type_global_highlighting = suggestion +resharper_unused_type_local_highlighting = warning +resharper_unused_type_parameter_highlighting = warning +resharper_unused_variable_highlighting = warning +resharper_usage_of_default_struct_equality_highlighting = warning +resharper_useless_binary_operation_highlighting = warning +resharper_useless_comparison_to_integral_constant_highlighting = warning +resharper_use_array_creation_expression_1_highlighting = suggestion +resharper_use_array_creation_expression_2_highlighting = suggestion +resharper_use_array_empty_method_highlighting = suggestion +resharper_use_await_using_highlighting = suggestion +resharper_use_cancellation_token_for_i_async_enumerable_highlighting = suggestion +resharper_use_collection_count_property_highlighting = suggestion +resharper_use_configure_await_false_for_async_disposable_highlighting = none +resharper_use_configure_await_false_highlighting = suggestion +resharper_use_deconstruction_highlighting = hint +resharper_use_discard_assignment_highlighting = suggestion +resharper_use_empty_types_field_highlighting = suggestion +resharper_use_event_args_empty_field_highlighting = suggestion +resharper_use_format_specifier_in_format_string_highlighting = suggestion +resharper_use_implicitly_typed_variable_evident_highlighting = hint +resharper_use_implicitly_typed_variable_highlighting = none +resharper_use_implicit_by_val_modifier_highlighting = hint +resharper_use_indexed_property_highlighting = suggestion +resharper_use_index_from_end_expression_highlighting = suggestion +resharper_use_method_any_0_highlighting = suggestion +resharper_use_method_any_1_highlighting = suggestion +resharper_use_method_any_2_highlighting = suggestion +resharper_use_method_any_3_highlighting = suggestion +resharper_use_method_any_4_highlighting = suggestion +resharper_use_nameof_expression_for_part_of_the_string_highlighting = none +resharper_use_nameof_expression_highlighting = suggestion +resharper_use_nameof_for_dependency_property_highlighting = suggestion +resharper_use_name_of_instead_of_to_string_highlighting = suggestion +resharper_use_name_of_instead_of_type_of_highlighting = suggestion +resharper_use_negated_pattern_in_is_expression_highlighting = hint +resharper_use_negated_pattern_matching_highlighting = hint +resharper_use_nullable_annotation_instead_of_attribute_highlighting = suggestion +resharper_use_nullable_attributes_supported_by_compiler_highlighting = suggestion +resharper_use_nullable_reference_types_annotation_syntax_highlighting = warning +resharper_use_null_propagation_highlighting = hint +resharper_use_object_or_collection_initializer_highlighting = suggestion +resharper_use_pattern_matching_highlighting = suggestion +resharper_use_positional_deconstruction_pattern_highlighting = none +resharper_use_raw_string_highlighting = hint +resharper_use_string_interpolation_highlighting = suggestion +resharper_use_string_interpolation_when_possible_highlighting = hint +resharper_use_switch_case_pattern_variable_highlighting = suggestion +resharper_use_symbol_alias_highlighting = hint +resharper_use_throw_if_null_method_highlighting = none +resharper_use_unsigned_right_shift_operator_highlighting = suggestion +resharper_use_verbatim_string_highlighting = hint +resharper_use_with_expression_to_copy_anonymous_object_highlighting = suggestion +resharper_use_with_expression_to_copy_record_highlighting = suggestion +resharper_use_with_expression_to_copy_struct_highlighting = suggestion +resharper_use_with_expression_to_copy_tuple_highlighting = suggestion +resharper_using_statement_resource_initialization_expression_highlighting = hint +resharper_using_statement_resource_initialization_highlighting = warning +resharper_value_parameter_not_used_highlighting = warning +resharper_value_range_attribute_violation_highlighting = warning +resharper_variable_can_be_not_nullable_highlighting = warning +resharper_variable_hides_outer_variable_highlighting = warning +resharper_variable_length_string_hex_escape_sequence_highlighting = warning +resharper_vb_check_for_reference_equality_instead_1_highlighting = suggestion +resharper_vb_check_for_reference_equality_instead_2_highlighting = suggestion +resharper_vb_possible_mistaken_argument_highlighting = warning +resharper_vb_possible_mistaken_call_to_get_type_1_highlighting = warning +resharper_vb_possible_mistaken_call_to_get_type_2_highlighting = warning +resharper_vb_remove_to_list_1_highlighting = suggestion +resharper_vb_remove_to_list_2_highlighting = suggestion +resharper_vb_replace_with_first_or_default_highlighting = suggestion +resharper_vb_replace_with_last_or_default_highlighting = suggestion +resharper_vb_replace_with_of_type_1_highlighting = suggestion +resharper_vb_replace_with_of_type_2_highlighting = suggestion +resharper_vb_replace_with_of_type_any_1_highlighting = suggestion +resharper_vb_replace_with_of_type_any_2_highlighting = suggestion +resharper_vb_replace_with_of_type_count_1_highlighting = suggestion +resharper_vb_replace_with_of_type_count_2_highlighting = suggestion +resharper_vb_replace_with_of_type_first_1_highlighting = suggestion +resharper_vb_replace_with_of_type_first_2_highlighting = suggestion +resharper_vb_replace_with_of_type_first_or_default_1_highlighting = suggestion +resharper_vb_replace_with_of_type_first_or_default_2_highlighting = suggestion +resharper_vb_replace_with_of_type_last_1_highlighting = suggestion +resharper_vb_replace_with_of_type_last_2_highlighting = suggestion +resharper_vb_replace_with_of_type_last_or_default_1_highlighting = suggestion +resharper_vb_replace_with_of_type_last_or_default_2_highlighting = suggestion +resharper_vb_replace_with_of_type_single_1_highlighting = suggestion +resharper_vb_replace_with_of_type_single_2_highlighting = suggestion +resharper_vb_replace_with_of_type_single_or_default_1_highlighting = suggestion +resharper_vb_replace_with_of_type_single_or_default_2_highlighting = suggestion +resharper_vb_replace_with_of_type_where_highlighting = suggestion +resharper_vb_replace_with_single_assignment_1_highlighting = suggestion +resharper_vb_replace_with_single_assignment_2_highlighting = suggestion +resharper_vb_replace_with_single_call_to_any_highlighting = suggestion +resharper_vb_replace_with_single_call_to_count_highlighting = suggestion +resharper_vb_replace_with_single_call_to_first_highlighting = suggestion +resharper_vb_replace_with_single_call_to_first_or_default_highlighting = suggestion +resharper_vb_replace_with_single_call_to_last_highlighting = suggestion +resharper_vb_replace_with_single_call_to_last_or_default_highlighting = suggestion +resharper_vb_replace_with_single_call_to_single_highlighting = suggestion +resharper_vb_replace_with_single_call_to_single_or_default_highlighting = suggestion +resharper_vb_replace_with_single_or_default_highlighting = suggestion +resharper_vb_simplify_linq_expression_10_highlighting = hint +resharper_vb_simplify_linq_expression_1_highlighting = suggestion +resharper_vb_simplify_linq_expression_2_highlighting = suggestion +resharper_vb_simplify_linq_expression_3_highlighting = suggestion +resharper_vb_simplify_linq_expression_4_highlighting = suggestion +resharper_vb_simplify_linq_expression_5_highlighting = suggestion +resharper_vb_simplify_linq_expression_6_highlighting = suggestion +resharper_vb_simplify_linq_expression_7_highlighting = hint +resharper_vb_simplify_linq_expression_8_highlighting = hint +resharper_vb_simplify_linq_expression_9_highlighting = hint +resharper_vb_string_compare_is_culture_specific_1_highlighting = warning +resharper_vb_string_compare_is_culture_specific_2_highlighting = warning +resharper_vb_string_compare_is_culture_specific_3_highlighting = warning +resharper_vb_string_compare_is_culture_specific_4_highlighting = warning +resharper_vb_string_compare_is_culture_specific_5_highlighting = warning +resharper_vb_string_compare_is_culture_specific_6_highlighting = warning +resharper_vb_string_compare_to_is_culture_specific_highlighting = warning +resharper_vb_string_ends_with_is_culture_specific_highlighting = none +resharper_vb_string_index_of_is_culture_specific_1_highlighting = warning +resharper_vb_string_index_of_is_culture_specific_2_highlighting = warning +resharper_vb_string_index_of_is_culture_specific_3_highlighting = warning +resharper_vb_string_last_index_of_is_culture_specific_1_highlighting = warning +resharper_vb_string_last_index_of_is_culture_specific_2_highlighting = warning +resharper_vb_string_last_index_of_is_culture_specific_3_highlighting = warning +resharper_vb_string_starts_with_is_culture_specific_highlighting = none +resharper_vb_unreachable_code_highlighting = warning +resharper_vb_use_array_creation_expression_1_highlighting = suggestion +resharper_vb_use_array_creation_expression_2_highlighting = suggestion +resharper_vb_use_first_instead_highlighting = warning +resharper_vb_use_method_any_1_highlighting = suggestion +resharper_vb_use_method_any_2_highlighting = suggestion +resharper_vb_use_method_any_3_highlighting = suggestion +resharper_vb_use_method_any_4_highlighting = suggestion +resharper_vb_use_method_any_5_highlighting = suggestion +resharper_vb_use_method_is_instance_of_type_highlighting = suggestion +resharper_vb_use_type_of_is_operator_1_highlighting = suggestion +resharper_vb_use_type_of_is_operator_2_highlighting = suggestion +resharper_virtual_member_call_in_constructor_highlighting = warning +resharper_virtual_member_never_overridden_global_highlighting = suggestion +resharper_virtual_member_never_overridden_local_highlighting = suggestion +resharper_void_method_with_must_dispose_resource_attribute_highlighting = warning +resharper_void_method_with_must_use_return_value_attribute_highlighting = warning +resharper_vulnerable_api_highlighting = warning +resharper_web_config_module_not_resolved_highlighting = warning +resharper_web_config_module_qualification_resolve_highlighting = warning +resharper_web_config_redundant_add_namespace_tag_highlighting = warning +resharper_web_config_redundant_location_tag_highlighting = warning +resharper_web_config_tag_prefix_redundand_highlighting = warning +resharper_web_config_type_not_resolved_highlighting = warning +resharper_web_config_unused_add_tag_highlighting = warning +resharper_web_config_unused_element_due_to_config_source_attribute_highlighting = warning +resharper_web_config_unused_remove_or_clear_tag_highlighting = warning +resharper_web_config_web_config_path_warning_highlighting = warning +resharper_web_config_wrong_module_highlighting = warning +resharper_web_ignored_path_highlighting = none +resharper_web_mapped_path_highlighting = hint +resharper_with_expression_instead_of_initializer_highlighting = suggestion +resharper_with_expression_modifies_all_members_highlighting = warning +resharper_wrong_indent_size_highlighting = none +resharper_xaml_assign_null_to_not_null_attribute_highlighting = warning +resharper_xaml_avalonia_wrong_binding_mode_for_stream_binding_operator_highlighting = warning +resharper_xaml_binding_without_context_not_resolved_highlighting = hint +resharper_xaml_binding_with_context_not_resolved_highlighting = warning +resharper_xaml_compiled_binding_missing_data_type_error_highlighting_highlighting = error +resharper_xaml_constructor_warning_highlighting = warning +resharper_xaml_decimal_parsing_is_culture_dependent_highlighting = warning +resharper_xaml_dependency_property_resolve_error_highlighting = warning +resharper_xaml_duplicate_style_setter_highlighting = warning +resharper_xaml_dynamic_resource_error_highlighting = error +resharper_xaml_element_name_reference_not_resolved_highlighting = error +resharper_xaml_empty_grid_length_definition_highlighting = error +resharper_xaml_field_modifier_requires_name_attribute_highlighting = warning +resharper_xaml_grid_definitions_can_be_converted_to_attribute_highlighting = hint +resharper_xaml_ignored_path_highlighting_highlighting = none +resharper_xaml_index_out_of_grid_definition_highlighting = warning +resharper_xaml_invalid_dynamic_resource_type_highlighting = suggestion +resharper_xaml_invalid_member_type_highlighting = error +resharper_xaml_invalid_resource_target_type_highlighting = error +resharper_xaml_invalid_resource_type_highlighting = error +resharper_xaml_invalid_type_highlighting = error +resharper_xaml_language_level_highlighting = error +resharper_xaml_mapped_path_highlighting_highlighting = hint +resharper_xaml_method_arguments_will_be_ignored_highlighting = warning +resharper_xaml_missing_grid_index_highlighting = warning +resharper_xaml_overloads_collision_highlighting = warning +resharper_xaml_parent_is_out_of_current_component_tree_highlighting = warning +resharper_xaml_path_error_highlighting = warning +resharper_xaml_possible_null_reference_exception_highlighting = suggestion +resharper_xaml_redundant_attached_property_highlighting = warning +resharper_xaml_redundant_binding_mode_attribute_highlighting = warning +resharper_xaml_redundant_collection_property_highlighting = warning +resharper_xaml_redundant_freeze_attribute_highlighting = warning +resharper_xaml_redundant_grid_definitions_highlighting = warning +resharper_xaml_redundant_grid_span_highlighting = warning +resharper_xaml_redundant_modifiers_attribute_highlighting = warning +resharper_xaml_redundant_namespace_alias_highlighting = warning +resharper_xaml_redundant_name_attribute_highlighting = warning +resharper_xaml_redundant_property_type_qualifier_highlighting = warning +resharper_xaml_redundant_resource_highlighting = warning +resharper_xaml_redundant_styled_value_highlighting = warning +resharper_xaml_redundant_update_source_trigger_attribute_highlighting = warning +resharper_xaml_redundant_xamarin_forms_class_declaration_highlighting = warning +resharper_xaml_resource_file_path_case_mismatch_highlighting = warning +resharper_xaml_routed_event_resolve_error_highlighting = warning +resharper_xaml_static_resource_not_resolved_highlighting = warning +resharper_xaml_style_class_not_found_highlighting = warning +resharper_xaml_style_invalid_target_type_highlighting = error +resharper_xaml_unexpected_element_highlighting = error +resharper_xaml_unexpected_text_token_highlighting = error +resharper_xaml_xaml_duplicate_device_family_type_view_highlighting_highlighting = error +resharper_xaml_xaml_mismatched_device_family_view_clr_name_highlighting_highlighting = warning +resharper_xaml_xaml_relative_source_default_mode_warning_highlighting_highlighting = warning +resharper_xaml_xaml_unknown_device_family_type_highlighting_highlighting = warning +resharper_xaml_xaml_xamarin_forms_data_type_and_binding_context_type_mismatched_highlighting_highlighting = warning +resharper_xaml_x_key_attribute_disallowed_highlighting = error +resharper_xunit_xunit_test_with_console_output_highlighting = warning +resharper_zero_index_from_end_highlighting = warning + +[{*.har,*.jsb2,*.jsb3,*.json,*.jsonc,*.postman_collection,*.postman_collection.json,*.postman_environment,*.postman_environment.json,.babelrc,.eslintrc,.prettierrc,.stylelintrc,.ws-context,jest.config}] +indent_style = space +indent_size = 2 + +[*.asmdef] +indent_style = space +indent_size = 2 + +[*.{appxmanifest,asax,ascx,aspx,axaml,blockshader,cg,cginc,compute,cs,cshtml,dtd,fs,fsi,fsscript,fsx,fx,fxh,hlsl,hlsli,hlslinc,master,ml,mli,nuspec,paml,razor,resw,resx,shader,shaderFoundry,skin,urtshader,usf,ush,uxml,vb,xaml,xamlx,xoml,xsd}] +indent_style = space +indent_size = 4 +tab_width = 4 diff --git a/.gitignore b/.gitignore index 4023ef67..7e50ced0 100644 --- a/.gitignore +++ b/.gitignore @@ -35,12 +35,6 @@ obj/ ehthumbs.db Thumbs.db -# ============ # -# IDEA generated # -# ============ # -/.idea - - # ============ # # Visual Studio Code generated # # ============ # @@ -50,3 +44,14 @@ TestBuilds/ Assets/AirConsole/airconsole.prefs* Assets/WebGLTemplates/**/airconsole-settings.js + +# ============ # +# IntellJ Code Style +# ============ # + +!/.idea/ +/.idea/* +!/.idea/.idea.airconsole-unity-plugin/ +!/.idea/.idea.airconsole-unity-plugin/.idea/ +/.idea/.idea.airconsole-unity-plugin/.idea/* +!/.idea/.idea.airconsole-unity-plugin/.idea/codeStyles/ diff --git a/.idea/.idea.airconsole-unity-plugin/.idea/codeStyles/Project.xml b/.idea/.idea.airconsole-unity-plugin/.idea/codeStyles/Project.xml new file mode 100644 index 00000000..a4c0f939 --- /dev/null +++ b/.idea/.idea.airconsole-unity-plugin/.idea/codeStyles/Project.xml @@ -0,0 +1,17 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea.airconsole-unity-plugin/.idea/codeStyles/codeStyleConfig.xml b/.idea/.idea.airconsole-unity-plugin/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 00000000..79ee123c --- /dev/null +++ b/.idea/.idea.airconsole-unity-plugin/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file From cb1130aef00de024adcfa81d41811154e21ed7c4 Mon Sep 17 00:00:00 2001 From: marc-n-dream Date: Thu, 11 Dec 2025 09:18:54 +0100 Subject: [PATCH 02/11] ai: add agentic configuration --- .serena/.gitignore | 1 + .serena/memories/project_overview.md | 6 ++ .serena/memories/style_and_conventions.md | 4 ++ .serena/memories/suggested_commands.md | 6 ++ .serena/memories/task_completion.md | 6 ++ .serena/project.yml | 84 +++++++++++++++++++++++ AGENTS.md | 82 ++++++++++++++++++++++ 7 files changed, 189 insertions(+) create mode 100644 .serena/.gitignore create mode 100644 .serena/memories/project_overview.md create mode 100644 .serena/memories/style_and_conventions.md create mode 100644 .serena/memories/suggested_commands.md create mode 100644 .serena/memories/task_completion.md create mode 100644 .serena/project.yml create mode 100644 AGENTS.md diff --git a/.serena/.gitignore b/.serena/.gitignore new file mode 100644 index 00000000..14d86ad6 --- /dev/null +++ b/.serena/.gitignore @@ -0,0 +1 @@ +/cache diff --git a/.serena/memories/project_overview.md b/.serena/memories/project_overview.md new file mode 100644 index 00000000..411e2377 --- /dev/null +++ b/.serena/memories/project_overview.md @@ -0,0 +1,6 @@ +# Project Overview +- Purpose: Unity plugin providing a C# wrapper around the AirConsole JavaScript API so Unity developers can build local multiplayer games that communicate with the AirConsole backend through the embedded web/websocket server. +- Tech stack: Unity/C# scripts plus accompanying assets located primarily under `Assets/`. Targets AirConsole-supported platforms (WebGL and Android TV). +- Repo structure highlights: Unity project root with standard folders (`Assets`, `Packages`, `ProjectSettings`, etc.), csproj files for various Unity modules/tests, documentation PDF in `Assets/AirConsole/Documentation_1.7.pdf`, and changelog/README at root. +- Entry points: open the Unity project (`airconsole-unity-plugin.sln` or via Unity Hub) and use provided AirConsole scenes/examples under `Assets/AirConsole` as the starting point. +- Special notes: includes embedded webserver/websocket server for editor communication, so no extra server dependency is required. \ No newline at end of file diff --git a/.serena/memories/style_and_conventions.md b/.serena/memories/style_and_conventions.md new file mode 100644 index 00000000..b79fa29b --- /dev/null +++ b/.serena/memories/style_and_conventions.md @@ -0,0 +1,4 @@ +# Style and Conventions +- Code is written in standard Unity/C# style (PascalCase for classes/methods, camelCase for private fields, serialized fields attributed as needed). +- Project relies on Unity-specific patterns (MonoBehaviours, scriptable objects, etc.); follow Unity's serialization and inspector conventions when modifying scripts. +- No repository-specific linting or formatting rules were documented, so adhere to default C# conventions and Unity best practices. \ No newline at end of file diff --git a/.serena/memories/suggested_commands.md b/.serena/memories/suggested_commands.md new file mode 100644 index 00000000..015c78e8 --- /dev/null +++ b/.serena/memories/suggested_commands.md @@ -0,0 +1,6 @@ +# Suggested Commands +- `git status` / `git diff` – inspect working tree and patch content. +- `ls` / `find . -name "*.cs"` – explore repository contents on macOS (Darwin) shell. +- `open airconsole-unity-plugin.sln` or launch via Unity Hub to edit/run the Unity project. +- Use the Unity Test Runner inside the Unity Editor to execute EditMode/PlayMode tests (no standalone CLI documented). +- Refer to the embedded documentation PDF at `Assets/AirConsole/Documentation_1.7.pdf` for setup instructions. \ No newline at end of file diff --git a/.serena/memories/task_completion.md b/.serena/memories/task_completion.md new file mode 100644 index 00000000..ccb983dd --- /dev/null +++ b/.serena/memories/task_completion.md @@ -0,0 +1,6 @@ +# Task Completion Checklist +- Ensure changes build inside the Unity Editor and do not break the AirConsole example scenes. +- Run relevant Unity EditMode/PlayMode tests through the Unity Test Runner if scripts were modified. +- Update README/CHANGELOG or documentation PDF references if behavior changes. +- Verify WebGL/Android-specific behavior when applicable (e.g., platform messaging, webview debugging instructions). +- Commit with clear messages and keep the embedded webserver/websocket functionality intact. \ No newline at end of file diff --git a/.serena/project.yml b/.serena/project.yml new file mode 100644 index 00000000..53eba993 --- /dev/null +++ b/.serena/project.yml @@ -0,0 +1,84 @@ +# list of languages for which language servers are started; choose from: +# al bash clojure cpp csharp csharp_omnisharp +# dart elixir elm erlang fortran go +# haskell java julia kotlin lua markdown +# nix perl php python python_jedi r +# rego ruby ruby_solargraph rust scala swift +# terraform typescript typescript_vts yaml zig +# Note: +# - For C, use cpp +# - For JavaScript, use typescript +# Special requirements: +# - csharp: Requires the presence of a .sln file in the project folder. +# When using multiple languages, the first language server that supports a given file will be used for that file. +# The first language is the default language and the respective language server will be used as a fallback. +# Note that when using the JetBrains backend, language servers are not used and this list is correspondingly ignored. +languages: +- csharp + +# the encoding used by text files in the project +# For a list of possible encodings, see https://docs.python.org/3.11/library/codecs.html#standard-encodings +encoding: "utf-8" + +# whether to use the project's gitignore file to ignore files +# Added on 2025-04-07 +ignore_all_files_in_gitignore: true + +# list of additional paths to ignore +# same syntax as gitignore, so you can use * and ** +# Was previously called `ignored_dirs`, please update your config if you are using that. +# Added (renamed) on 2025-04-07 +ignored_paths: [] + +# whether the project is in read-only mode +# If set to true, all editing tools will be disabled and attempts to use them will result in an error +# Added on 2025-04-18 +read_only: false + +# list of tool names to exclude. We recommend not excluding any tools, see the readme for more details. +# Below is the complete list of tools for convenience. +# To make sure you have the latest list of tools, and to view their descriptions, +# execute `uv run scripts/print_tool_overview.py`. +# +# * `activate_project`: Activates a project by name. +# * `check_onboarding_performed`: Checks whether project onboarding was already performed. +# * `create_text_file`: Creates/overwrites a file in the project directory. +# * `delete_lines`: Deletes a range of lines within a file. +# * `delete_memory`: Deletes a memory from Serena's project-specific memory store. +# * `execute_shell_command`: Executes a shell command. +# * `find_referencing_code_snippets`: Finds code snippets in which the symbol at the given location is referenced. +# * `find_referencing_symbols`: Finds symbols that reference the symbol at the given location (optionally filtered by type). +# * `find_symbol`: Performs a global (or local) search for symbols with/containing a given name/substring (optionally filtered by type). +# * `get_current_config`: Prints the current configuration of the agent, including the active and available projects, tools, contexts, and modes. +# * `get_symbols_overview`: Gets an overview of the top-level symbols defined in a given file. +# * `initial_instructions`: Gets the initial instructions for the current project. +# Should only be used in settings where the system prompt cannot be set, +# e.g. in clients you have no control over, like Claude Desktop. +# * `insert_after_symbol`: Inserts content after the end of the definition of a given symbol. +# * `insert_at_line`: Inserts content at a given line in a file. +# * `insert_before_symbol`: Inserts content before the beginning of the definition of a given symbol. +# * `list_dir`: Lists files and directories in the given directory (optionally with recursion). +# * `list_memories`: Lists memories in Serena's project-specific memory store. +# * `onboarding`: Performs onboarding (identifying the project structure and essential tasks, e.g. for testing or building). +# * `prepare_for_new_conversation`: Provides instructions for preparing for a new conversation (in order to continue with the necessary context). +# * `read_file`: Reads a file within the project directory. +# * `read_memory`: Reads the memory with the given name from Serena's project-specific memory store. +# * `remove_project`: Removes a project from the Serena configuration. +# * `replace_lines`: Replaces a range of lines within a file with new content. +# * `replace_symbol_body`: Replaces the full definition of a symbol. +# * `restart_language_server`: Restarts the language server, may be necessary when edits not through Serena happen. +# * `search_for_pattern`: Performs a search for a pattern in the project. +# * `summarize_changes`: Provides instructions for summarizing the changes made to the codebase. +# * `switch_modes`: Activates modes by providing a list of their names +# * `think_about_collected_information`: Thinking tool for pondering the completeness of collected information. +# * `think_about_task_adherence`: Thinking tool for determining whether the agent is still on track with the current task. +# * `think_about_whether_you_are_done`: Thinking tool for determining whether the task is truly completed. +# * `write_memory`: Writes a named memory (for future reference) to Serena's project-specific memory store. +excluded_tools: [] + +# initial prompt for the project. It will always be given to the LLM upon activating the project +# (contrary to the memories, which are loaded on demand). +initial_prompt: "" + +project_name: "airconsole-unity-plugin" +included_optional_tools: [] diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..bba26ec9 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,82 @@ +# AGENTS GUIDE — Assets/AirConsole Focus + +The `airconsole-unity-plugin` project targets Unity 2022.3.x and ships the full AirConsole runtime, editor tooling, Android TV helpers, and WebGL controller templates. This guide is tailored to the contents under `Assets/AirConsole`. + +## What Lives in Assets/AirConsole + +- `scripts/Runtime`: Core API surface (`AirConsole.cs`), websocket/webview bridges (`WebsocketListener.cs`, `WebViewManager.cs`), runtime settings (`Settings.cs`, `AirconsoleRuntimeSettings.cs`, `NativeGameSizingSettings.cs`), logging (`AirConsoleLogger.cs`, `DebugLevel.cs`), platform runtime configurators, and Android plugin wrappers under `Runtime/Plugin/Android`. +- `scripts/Editor`: Custom inspectors/windows (`Inspector.cs`, `SettingWindow.cs`, `PlayMode.cs`, `SafeAreaTester.cs`, `WebListener.cs`), build automation (`BuildAutomation/*`), project maintenance checks (`ProjectMaintenance/*`), and plugin developer helpers (`PluginDevelopment/*`). +- `scripts/SupportCheck`: Unity version/platform validator ASMDEF used in-editor. +- `scripts/Tests`: ASMDEF-scoped EditMode, PlayMode, and Editor tests. +- `examples`: Sample scenes (`basic`, `pong`, `platformer`, `swipe`, `game-states`, `safe-area`, `translations`) for manual validation. +- `extras`: Controller template HTML and `HighScoreHelper.cs`. +- `plugins`: Managed dependencies (`Newtonsoft.Json.dll`, `websocket-sharp.dll`) plus Android native plugin payload under `plugins/Android`. +- `unity-webview`: Embedded WebView plugin with runtime/editor asmdefs and native binaries under `Plugins`. +- `unity-webview` is an imported external dependency. You are not allowed to alter it. +- Docs and misc: `Documentation_1.7.pdf`, `Documentation for AndroidTV.pdf`, `Upgrade_Plugin_Version.md`, `README.txt`, `airconsole.prefs`, and the distributable `airconsole-code.unitypackage`. + +## Runtime Essentials + +- **API + bridge**: `AirConsole.cs` exposes the public API; `WebsocketListener` routes JSON actions/events; `WebViewManager` coordinates the embedded webview. Add new events in both the listener and the API surface. +- **Config assets**: `AirconsoleRuntimeSettings.asset` and `NativeGameSizingSettings.asset` (in `scripts/Runtime/Resources`) hold defaults for ports, safe-area sizing, etc. Adjust via the editor UI instead of hardcoding. +- **Platform setup**: Implementations of `IRuntimeConfigurator` (`AndroidRuntimeConfigurator`, `WebGLRuntimeConfigurator`, `EditorRuntimeConfigurator`) handle platform-specific initialization. Extend these rather than branching deep in the API. +- **Android plugin wrappers**: `PluginManager`, `AndroidUnityUtils`, and callback helpers (`UnityPluginExecutionCallback`, `UnityPluginStringCallback`, `GenericUnityPluginCallback`, `UnityAndroidObjectProvider`) encapsulate Java bridge calls. Keep new native hooks consistent with these wrappers. +- **Logging & diagnostics**: Use `AirConsoleLogger` with `DebugLevel` enums to respect runtime debug settings. + +## Editor & Build Tooling + +- **UI/inspectors**: `SettingWindow`, `Inspector`, `PlayMode`, `SafeAreaTester`, and `WebListener` provide editor UI and simulator hooks. Prefer extending these instead of adding ad-hoc windows. +- **Build automation** (`scripts/Editor/BuildAutomation`): + - `PreBuildProcessing` and `PostBuildProcess` wrap pre/post hooks; post steps validate WebGL template AirConsole JS versions. + - `AndroidManifestProcessor`, `AndroidGradleProcessor`, `AndroidProjectProcessor`, `AndroidManifest`, and `AndroidXMLDocument` mutate generated Android projects/manifests. Use these helpers instead of manual IO. +- **Project maintenance** (`ProjectMaintenance`): `ProjectDependencyCheck`, `SemVerCheck`, and `ProjectConfigurationCheck` enforce Unity version and project settings; `ProjectPreferenceManager/ProjectPreferences` manage stored preferences; `ProjectUpgradeEditor` supports upgrade flows. +- **Plugin development helpers** (`PluginDevelopment`): `BuildHelper` hosts build/packaging entry points (Web/Android) and can auto-zip or auto-commit; `DevelopmentTools` includes additional packager utilities. + +## Tests, Samples, Validation + +- Tests live under `scripts/Tests` (EditMode/PlayMode/Editor asmdefs). Run via Unity Test Runner; some PlayMode tests expect Android as the active build target. +- Manual checks: leverage sample scenes in `examples` to verify controller flows, safe-area behavior, translations, and Android TV input. +- WebGL validation: keep `PostBuildProcess` version checks aligned with the AirConsole JS used in `Assets/WebGLTemplates/AirConsole-*`. + +## Dependencies & Third-Party + +- Managed DLLs: `Newtonsoft.Json.dll` and `websocket-sharp.dll` are under `plugins/` and referenced by runtime asmdefs. +- Embedded webview: `unity-webview` includes runtime/editor code plus native libs under `unity-webview/Plugins`. +- Android native pieces are under `plugins/Android`; ensure gradle/manifest processors remain compatible when updating them. + +## Common Workflows + +- **Add/extend an API event**: Update `WebsocketListener` to parse/route the action, expose it in `AirConsole`, and wire through logging; add tests where possible. +- **Adjust runtime defaults**: Modify `AirconsoleRuntimeSettings.asset` or `NativeGameSizingSettings.asset` (via editor windows). Avoid hardcoded constants in code. +- **Android manifest/Gradle edits**: Implement changes in `AndroidManifestProcessor`/`AndroidGradleProcessor`/`AndroidProjectProcessor`; ensure `useCustomMainManifest` stays enabled. +- **WebGL template/JS version bumps**: Update constants/regex in `PostBuildProcess`, refresh `Settings.RequiredMinimumVersion` if needed, and sync HTML in `Assets/WebGLTemplates/AirConsole-*`. +- **Packaging/exports**: Use `BuildHelper.BuildWeb()`, `BuildHelper.BuildAndroid()`, or `BuildHelper.BuildAndroidInternal()`; they run configuration checks and can zip outputs. + +## Guardrails & Gotchas + +- Conditional compilation is heavily used: `#if !DISABLE_AIRCONSOLE`, `UNITY_ANDROID`, `UNITY_EDITOR`, `UNITY_WEBGL`. Keep new code behind appropriate defines and asmdefs. +- Respect asmdef boundaries (`AirConsole.Runtime`, `AirConsole.Editor`, `AirConsole.SupportCheck`, `AirConsole.Examples`, `unity-webview`); place new files in matching folders. +- Embedded websocket/webview server underpins editor play; avoid breaking `WebsocketListener`/`WebViewManager` interactions (ports come from runtime settings). +- Safe-area handling is central for Android TV/Automotive—maintain `OnSafeAreaChanged` flows and avoid state changes before safe-area readiness. +- Build helper may auto-commit with `build: TIMESTAMP` when uncommitted changes exist; be mindful when running locally. + +## Event Queue Architecture (Thread-Safe Callbacks) + +The WebView plugin uses a thread-safe event queue to handle callbacks from native code (Android only at this point): + +### Event Processing Lifecycle + +Events are processed at multiple points to ensure timely delivery: + +1. **`Update()`**: Primary drain point (every frame) +2. **`LateUpdate()`**: Secondary drain (end of frame) +3. **`FixedUpdate()`**: Tertiary drain (physics frame / fixed timestep / before rendering) +4. **`OnApplicationPause(false)`**: Flush on resume +5. **`OnDisable()`**: Flush before component teardown +6. **`OnApplicationQuit()`**: Final flush before app exit + +## Additional References + +- `Documentation_1.7.pdf` (setup/examples), `Documentation for AndroidTV.pdf`, and `Upgrade_Plugin_Version.md` for upgrade flows. +- Controller HTML template: `extras/controller-template.html`. +- Quick intro: `Assets/AirConsole/README.txt`; preferences file `airconsole.prefs`. From 4a14ca01630889607a6586033bbe9c149de6090b Mon Sep 17 00:00:00 2001 From: marc-n-dream Date: Thu, 11 Dec 2025 10:21:37 +0100 Subject: [PATCH 03/11] . F: support androidtv url parameter to detect android tv vs automotive for topbar vs fullscreen event flows --- .../AirConsole-2020/airconsole-unity-plugin.js | 6 +++++- .../AirConsole-U6/airconsole-settings.js.meta | 7 ------- .../AirConsole-U6/airconsole-unity-plugin.js | 8 ++++++-- 3 files changed, 11 insertions(+), 10 deletions(-) delete mode 100644 Assets/WebGLTemplates/AirConsole-U6/airconsole-settings.js.meta diff --git a/Assets/WebGLTemplates/AirConsole-2020/airconsole-unity-plugin.js b/Assets/WebGLTemplates/AirConsole-2020/airconsole-unity-plugin.js index a27095ac..0ac711af 100644 --- a/Assets/WebGLTemplates/AirConsole-2020/airconsole-unity-plugin.js +++ b/Assets/WebGLTemplates/AirConsole-2020/airconsole-unity-plugin.js @@ -1,6 +1,6 @@ /** * Copyright by N-Dream AG 2025. - * @version 2.6.0 + * @version 2.6.2 */ /** @@ -9,6 +9,10 @@ function App(container, canvas, web_config, progress_config) { var me = this; + + // TODO(PRO-1804): Remove this workaround when Android TV uses a fullscreen webview too + const isAndroidTV = window.location.search.includes('androidTv=1'); + window.AIRCONSOLE_ANDROID_NATIVE_GAMESIZING = window.AIRCONSOLE_ANDROID_NATIVE_GAMESIZING && !isAndroidTV; me.is_native_app = typeof Unity != "undefined"; me.is_editor = !!me.getURLParameterByName("unity-editor-websocket-port"); diff --git a/Assets/WebGLTemplates/AirConsole-U6/airconsole-settings.js.meta b/Assets/WebGLTemplates/AirConsole-U6/airconsole-settings.js.meta deleted file mode 100644 index 120bdf38..00000000 --- a/Assets/WebGLTemplates/AirConsole-U6/airconsole-settings.js.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: b63b835fd6ecf40dea8c11e1afe40ec6 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/WebGLTemplates/AirConsole-U6/airconsole-unity-plugin.js b/Assets/WebGLTemplates/AirConsole-U6/airconsole-unity-plugin.js index 1c556c1f..c10b995b 100644 --- a/Assets/WebGLTemplates/AirConsole-U6/airconsole-unity-plugin.js +++ b/Assets/WebGLTemplates/AirConsole-U6/airconsole-unity-plugin.js @@ -1,6 +1,6 @@ /** * Copyright by N-Dream AG 2025. - * @version 2.6.0 + * @version 2.6.2 */ /** @@ -9,7 +9,11 @@ function App(container, canvas, web_config, progress_config) { var me = this; - + + // TODO(PRO-1804): Remove this workaround when Android TV uses a fullscreen webview too + const isAndroidTV = window.location.search.includes('androidTv=1'); + window.AIRCONSOLE_ANDROID_NATIVE_GAMESIZING = window.AIRCONSOLE_ANDROID_NATIVE_GAMESIZING && !isAndroidTV; + me.is_native_app = typeof Unity != "undefined"; me.is_editor = !!me.getURLParameterByName("unity-editor-websocket-port"); if (!window.AIRCONSOLE_ANDROID_NATIVE_GAMESIZING) { From 40a9d0cfe93c2fd51506abe45de68febab611a32 Mon Sep 17 00:00:00 2001 From: marc-n-dream Date: Thu, 11 Dec 2025 10:24:20 +0100 Subject: [PATCH 04/11] a: Reformat code --- .../scripts/Editor/AirConsole.Editor.asmdef | 42 ++++++++-------- .../scripts/Runtime/AirConsole.Runtime.asmdef | 50 +++++++++---------- .../Android/GenericUnityPluginCallback.cs | 2 +- .../AirConsole.SupportCheck.asmdef | 38 +++++++------- .../EditMode/AirConsole.EditMode.Tests.asmdef | 50 +++++++++---------- .../Editor/AirConsole.Editor.Tests.asmdef | 50 +++++++++---------- .../PlayMode/AirConsole.PlayMode.Tests.asmdef | 42 ++++++++-------- 7 files changed, 137 insertions(+), 137 deletions(-) diff --git a/Assets/AirConsole/scripts/Editor/AirConsole.Editor.asmdef b/Assets/AirConsole/scripts/Editor/AirConsole.Editor.asmdef index 216e967d..d2150dcc 100644 --- a/Assets/AirConsole/scripts/Editor/AirConsole.Editor.asmdef +++ b/Assets/AirConsole/scripts/Editor/AirConsole.Editor.asmdef @@ -1,23 +1,23 @@ { - "name": "AirConsole.Editor", - "rootNamespace": "NDream.AirConsole.Editor", - "references": [ - "AirConsole.Runtime", - "UnityEditor.UI" - ], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": true, - "precompiledReferences": [ - "Newtonsoft.Json.dll" - ], - "autoReferenced": true, - "defineConstraints": [ - "UNITY_2022_3_OR_NEWER" - ], - "versionDefines": [], - "noEngineReferences": false + "name": "AirConsole.Editor", + "rootNamespace": "NDream.AirConsole.Editor", + "references": [ + "AirConsole.Runtime", + "UnityEditor.UI" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "Newtonsoft.Json.dll" + ], + "autoReferenced": true, + "defineConstraints": [ + "UNITY_2022_3_OR_NEWER" + ], + "versionDefines": [], + "noEngineReferences": false } \ No newline at end of file diff --git a/Assets/AirConsole/scripts/Runtime/AirConsole.Runtime.asmdef b/Assets/AirConsole/scripts/Runtime/AirConsole.Runtime.asmdef index 8913fa27..b771d892 100644 --- a/Assets/AirConsole/scripts/Runtime/AirConsole.Runtime.asmdef +++ b/Assets/AirConsole/scripts/Runtime/AirConsole.Runtime.asmdef @@ -1,27 +1,27 @@ { - "name": "AirConsole.Runtime", - "rootNamespace": "NDream.AirConsole", - "references": [ - "Unity.TextMeshPro", - "UnityEngine.UI", - "com.airconsole.unity-webview.runtime" - ], - "includePlatforms": [ - "Android", - "Editor", - "WebGL" - ], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": true, - "precompiledReferences": [ - "Newtonsoft.Json.dll", - "websocket-sharp.dll" - ], - "autoReferenced": true, - "defineConstraints": [ - "UNITY_2022_3_OR_NEWER" - ], - "versionDefines": [], - "noEngineReferences": false + "name": "AirConsole.Runtime", + "rootNamespace": "NDream.AirConsole", + "references": [ + "Unity.TextMeshPro", + "UnityEngine.UI", + "com.airconsole.unity-webview.runtime" + ], + "includePlatforms": [ + "Android", + "Editor", + "WebGL" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "Newtonsoft.Json.dll", + "websocket-sharp.dll" + ], + "autoReferenced": true, + "defineConstraints": [ + "UNITY_2022_3_OR_NEWER" + ], + "versionDefines": [], + "noEngineReferences": false } \ No newline at end of file diff --git a/Assets/AirConsole/scripts/Runtime/Plugin/Android/GenericUnityPluginCallback.cs b/Assets/AirConsole/scripts/Runtime/Plugin/Android/GenericUnityPluginCallback.cs index c589caf7..7b12ab23 100644 --- a/Assets/AirConsole/scripts/Runtime/Plugin/Android/GenericUnityPluginCallback.cs +++ b/Assets/AirConsole/scripts/Runtime/Plugin/Android/GenericUnityPluginCallback.cs @@ -24,4 +24,4 @@ public void onExecute(T value) { } } } -#endif \ No newline at end of file +#endif diff --git a/Assets/AirConsole/scripts/SupportCheck/AirConsole.SupportCheck.asmdef b/Assets/AirConsole/scripts/SupportCheck/AirConsole.SupportCheck.asmdef index 4e261d08..50434e89 100644 --- a/Assets/AirConsole/scripts/SupportCheck/AirConsole.SupportCheck.asmdef +++ b/Assets/AirConsole/scripts/SupportCheck/AirConsole.SupportCheck.asmdef @@ -1,21 +1,21 @@ { - "name": "AirConsole.Support", - "rootNamespace": "NDream.AirConsole.Support", - "references": [], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": true, - "precompiledReferences": [ - "Newtonsoft.Json.dll", - "websocket-sharp.dll" - ], - "autoReferenced": true, - "defineConstraints": [ - "!UNITY_2022_3_OR_NEWER" - ], - "versionDefines": [], - "noEngineReferences": false + "name": "AirConsole.Support", + "rootNamespace": "NDream.AirConsole.Support", + "references": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "Newtonsoft.Json.dll", + "websocket-sharp.dll" + ], + "autoReferenced": true, + "defineConstraints": [ + "!UNITY_2022_3_OR_NEWER" + ], + "versionDefines": [], + "noEngineReferences": false } \ No newline at end of file diff --git a/Assets/AirConsole/scripts/Tests/EditMode/AirConsole.EditMode.Tests.asmdef b/Assets/AirConsole/scripts/Tests/EditMode/AirConsole.EditMode.Tests.asmdef index 0c045dda..b0dd4f8a 100644 --- a/Assets/AirConsole/scripts/Tests/EditMode/AirConsole.EditMode.Tests.asmdef +++ b/Assets/AirConsole/scripts/Tests/EditMode/AirConsole.EditMode.Tests.asmdef @@ -1,27 +1,27 @@ { - "name": "AirConsole.EditMode.Tests", - "rootNamespace": "NDream.AirConsole.EditMode.Tests", - "references": [ - "UnityEngine.TestRunner", - "AirConsole.Runtime" - ], - "includePlatforms": [ - "Android", - "Editor", - "WebGL" - ], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": true, - "precompiledReferences": [ - "nunit.framework.dll", - "Newtonsoft.Json.dll" - ], - "autoReferenced": true, - "defineConstraints": [ - "UNITY_2022_3_OR_NEWER", - "UNITY_INCLUDE_TESTS" - ], - "versionDefines": [], - "noEngineReferences": false + "name": "AirConsole.EditMode.Tests", + "rootNamespace": "NDream.AirConsole.EditMode.Tests", + "references": [ + "UnityEngine.TestRunner", + "AirConsole.Runtime" + ], + "includePlatforms": [ + "Android", + "Editor", + "WebGL" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "nunit.framework.dll", + "Newtonsoft.Json.dll" + ], + "autoReferenced": true, + "defineConstraints": [ + "UNITY_2022_3_OR_NEWER", + "UNITY_INCLUDE_TESTS" + ], + "versionDefines": [], + "noEngineReferences": false } \ No newline at end of file diff --git a/Assets/AirConsole/scripts/Tests/Editor/AirConsole.Editor.Tests.asmdef b/Assets/AirConsole/scripts/Tests/Editor/AirConsole.Editor.Tests.asmdef index 88f8ecb1..987a0627 100644 --- a/Assets/AirConsole/scripts/Tests/Editor/AirConsole.Editor.Tests.asmdef +++ b/Assets/AirConsole/scripts/Tests/Editor/AirConsole.Editor.Tests.asmdef @@ -1,27 +1,27 @@ { - "name": "AirConsole.Editor.Tests", - "rootNamespace": "NDream.AirConsole.Editor.Tests", - "references": [ - "UnityEngine.TestRunner", - "UnityEditor.TestRunner", - "AirConsole.Runtime", - "AirConsole.Editor" - ], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": true, - "precompiledReferences": [ - "nunit.framework.dll", - "Newtonsoft.Json.dll" - ], - "autoReferenced": false, - "defineConstraints": [ - "UNITY_2022_3_OR_NEWER", - "UNITY_INCLUDE_TESTS" - ], - "versionDefines": [], - "noEngineReferences": false + "name": "AirConsole.Editor.Tests", + "rootNamespace": "NDream.AirConsole.Editor.Tests", + "references": [ + "UnityEngine.TestRunner", + "UnityEditor.TestRunner", + "AirConsole.Runtime", + "AirConsole.Editor" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "nunit.framework.dll", + "Newtonsoft.Json.dll" + ], + "autoReferenced": false, + "defineConstraints": [ + "UNITY_2022_3_OR_NEWER", + "UNITY_INCLUDE_TESTS" + ], + "versionDefines": [], + "noEngineReferences": false } \ No newline at end of file diff --git a/Assets/AirConsole/scripts/Tests/PlayMode/AirConsole.PlayMode.Tests.asmdef b/Assets/AirConsole/scripts/Tests/PlayMode/AirConsole.PlayMode.Tests.asmdef index 5938c6d5..f85bc658 100644 --- a/Assets/AirConsole/scripts/Tests/PlayMode/AirConsole.PlayMode.Tests.asmdef +++ b/Assets/AirConsole/scripts/Tests/PlayMode/AirConsole.PlayMode.Tests.asmdef @@ -1,23 +1,23 @@ { - "name": "AirConsole.PlayMode.Tests", - "rootNamespace": "NDream.AirConsole.PlayMode.Tests", - "references": [ - "UnityEngine.TestRunner", - "AirConsole.Runtime" - ], - "includePlatforms": [], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": true, - "precompiledReferences": [ - "nunit.framework.dll", - "Newtonsoft.Json.dll" - ], - "autoReferenced": false, - "defineConstraints": [ - "UNITY_2022_3_OR_NEWER", - "UNITY_INCLUDE_TESTS" - ], - "versionDefines": [], - "noEngineReferences": false + "name": "AirConsole.PlayMode.Tests", + "rootNamespace": "NDream.AirConsole.PlayMode.Tests", + "references": [ + "UnityEngine.TestRunner", + "AirConsole.Runtime" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "nunit.framework.dll", + "Newtonsoft.Json.dll" + ], + "autoReferenced": false, + "defineConstraints": [ + "UNITY_2022_3_OR_NEWER", + "UNITY_INCLUDE_TESTS" + ], + "versionDefines": [], + "noEngineReferences": false } \ No newline at end of file From 238ddca19c7d482b56152b96eade3127641cddd5 Mon Sep 17 00:00:00 2001 From: marc-n-dream Date: Thu, 11 Dec 2025 10:48:43 +0100 Subject: [PATCH 05/11] r: Update version to 2.6.2 --- Assets/AirConsole/scripts/Runtime/Settings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/AirConsole/scripts/Runtime/Settings.cs b/Assets/AirConsole/scripts/Runtime/Settings.cs index 9ca3f8a5..d3a64589 100644 --- a/Assets/AirConsole/scripts/Runtime/Settings.cs +++ b/Assets/AirConsole/scripts/Runtime/Settings.cs @@ -5,7 +5,7 @@ namespace NDream.AirConsole { public static class Settings { public static readonly Version RequiredMinimumVersion = new(1, 10, 0); - public const string VERSION = "2.6.1"; + public const string VERSION = "2.6.2"; // ReSharper disable once UnusedMember.Global // Used by AirConsole on Android only public const string AIRCONSOLE_BASE_URL = "https://www.airconsole.com/"; From daf618cc5dce469d66d393229d8813b1d6bfd39c Mon Sep 17 00:00:00 2001 From: marc-n-dream Date: Thu, 11 Dec 2025 10:49:23 +0100 Subject: [PATCH 06/11] ! R: Improve project code updater with the ability to skip structure cleanup when unnecessary --- Assets/AirConsole/ProjectCodeUpdater.cs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/Assets/AirConsole/ProjectCodeUpdater.cs b/Assets/AirConsole/ProjectCodeUpdater.cs index 069bdc49..b2aebc06 100644 --- a/Assets/AirConsole/ProjectCodeUpdater.cs +++ b/Assets/AirConsole/ProjectCodeUpdater.cs @@ -30,10 +30,12 @@ private static void ImportCodePackage() { // In 2.6.0, this was moved to Assets/AirConsole/scripts/Editor/Assets/AirConsoleIcon.png with editor icon focused import settings. AssetDatabase.DeleteAsset("Assets/AirConsole/resources/AirConsoleLogo.png"); - AssetDatabase.DeleteAsset("Assets/AirConsole/examples"); - AssetDatabase.DeleteAsset("Assets/AirConsole/scripts"); - AssetDatabase.DeleteAsset("Assets/AirConsole/unity-webview"); - AssetDatabase.Refresh(); + if (RequiresStructureCleanup()) { + AssetDatabase.DeleteAsset("Assets/AirConsole/examples"); + AssetDatabase.DeleteAsset("Assets/AirConsole/scripts"); + AssetDatabase.DeleteAsset("Assets/AirConsole/unity-webview"); + AssetDatabase.Refresh(); + } // Because the AssetDatabase refresh happens asynchronously at the end of the editor loop, we must use delayedCall to // execute the package import. Otherwise, files like AirConsole.cs that must be imported in the 'scripts/Runtime' directory @@ -50,6 +52,16 @@ private static void ExecuteCodePackageImport() { AssetDatabase.DeleteAsset($"Assets/AirConsole/{nameof(ProjectCodeUpdater)}.cs"); AssetDatabase.DeleteAsset(CodePackagePath.Replace(Application.dataPath, "Assets")); } + + private static bool RequiresStructureCleanup() { + string legacyAirConsolePath = Path.Combine(Application.dataPath, "AirConsole", "scripts", "AirConsole.cs"); + string runtimeAirConsolePath = Path.Combine(Application.dataPath, "AirConsole", "scripts", "Runtime", "AirConsole.cs"); + + bool legacyExists = File.Exists(legacyAirConsolePath); + bool runtimeExists = File.Exists(runtimeAirConsolePath); + + return legacyExists && !runtimeExists; + } } } #endif From 74b8d9bca97739edac7ff9d6e6342db5c4da5ff5 Mon Sep 17 00:00:00 2001 From: marc-n-dream Date: Thu, 11 Dec 2025 10:49:51 +0100 Subject: [PATCH 07/11] r: Update create-release GH action --- .github/workflows/create-release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/create-release.yaml b/.github/workflows/create-release.yaml index 73d6ad6e..e84af26f 100644 --- a/.github/workflows/create-release.yaml +++ b/.github/workflows/create-release.yaml @@ -125,7 +125,7 @@ jobs: # run: | # filepath="Builds/airconsole-unity-plugin-v${{ env.version }}.unitypackage" # if [ ! -f "$filepath" ]; then - # echo "Build validation of airconsole-unity-plugin-v${{ env.version }}unitypackage failed" + # echo "Build validation of airconsole-unity-plugin-v${{ env.version }} unitypackage failed" # exit 1 # fi @@ -140,7 +140,7 @@ jobs: # uses: softprops/action-gh-release@v1 # if: startsWith(github.ref, 'refs/tags/') # with: - # files: Builds/release-${{ github.event.inputs.version }}.unitypackage + # files: Builds/airconsole-unity-plugin-v${{ github.event.inputs.version }}.unitypackage # body: ${{ steps.extract-release-notes.outputs.release_notes }} # env: # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 44a36d55eb7955218630816b14c660cf06f883be Mon Sep 17 00:00:00 2001 From: marc-n-dream Date: Thu, 11 Dec 2025 10:53:13 +0100 Subject: [PATCH 08/11] e: Update unityandroidlibrary to v2.6.2 --- .../plugins/Android/unityandroidlibrary.aar | Bin 62966 -> 61770 bytes .../Runtime/Plugin/Android/PluginManager.cs | 75 ++++++++++-------- 2 files changed, 42 insertions(+), 33 deletions(-) diff --git a/Assets/AirConsole/plugins/Android/unityandroidlibrary.aar b/Assets/AirConsole/plugins/Android/unityandroidlibrary.aar index e8d0a560d6a74954683f9309c072f561b3c0cb98..d107448ab24cc6cb7aa084cd7ba00c5a948d5d12 100644 GIT binary patch delta 24243 zcmV(+K;6Ig>jTQ-1F&)ef6NY~Bj;QI05xO)01E&B0Ap-nb8}^LE^1+Nl$ukJX3f^E zi``|LU0t?q+qP}nwr$(CZJTe|HqN)t{x8n{ul89Hd6BsyRz^HI=ZG;@q?{xu7|=ft z1P}oP0SJP@e%l{lAfWJnhTuP|hPKwU`sNOXwlri>Hs((5fBH5?4z}h-R^|o{ z`VQ{2qQ*AH4(5i+|9T~7WuR|pNn>cG@91b8J1sHDhu~*g&0?*5djNe| zF0jbgtad&tycC(YcJAGfUbJcBGHIhgWzfHRzX$p%cTjRL3SF(oaKqp1)SPL2=X{Q1zh5jp6jM4dC&$1Tvh%N?(BLh>yU~dVNBapp0@6 zkyo-%r;;aK850^`E6^5cEgF}&Q!2(&N*DJImQc0@tDDaAf9Ap4k+%1b7swWVxl0nV zcWDpD!1*)<27}2E(d~^RgZ7=(_iVg5P3Q0C#;eUf7Bj($Tu{jFhhxe^I-WHXfX29d zGlO>N{`PP#tG2%SE%zS>kiC}~hXw}(G(iXi#PZ)Az`vnO>)Ys?8aw=(`L?>d7xt?C zw+LAKAFy*EfAYyBD#!xkNHFpKcx&|)X?b*Mg#=+-|4Sit5J`*TVVW*zxrA*t>BT|u z3%oPqR+~&F>*YabYE>}fM*D?GbAy+jn@6eIM~T`pnWdYnfIngZ3^?pRO7D;#&)w;^ z$J0}p>83oTNt}JWL+bq6aK2Fl>uH2}=m*^OzSL zl%ZcHdLj2U=CL;DOw$QyB1&^>n~s-KH+-{maeC&Ewu&0AtWW1eY7}kUo&w?L<407C zSDFp0^$#P%U3t!VLvd1-E>8x*Zx>8E;(V;>)swZyyqN-CL?ycSiR!kYAvO4^x2>?9ec@Ca)hoSTa=BU9jUqe z7KwzT%hZy>m3pq!K)+!(?WUVT&WXvXoDp>=}O0Jgbl-EeQto2iR+gG6^U@$=6P zU>EIL4W!wuqhSqSXt)Z{p5VLRks=*?_*D#jTn}BsV}2LZrskIDI!aR@|tg$D|5qCwnFugu1p2k<76t8 z^4vT9U>$tbb9S_ffU@{n6@8UfS1L8bf;N23zisgFLiITG#K-+)8+9ttZ5<>SS5bfQ zqFh#6U=;=78+So~u`$Y61G?AHhb6XZ;^6D*%5lrQ)M=e9r>pKF(qm<+-8^EfTW%B%8Y}+4>EfBSR$z z%hjo65PY!|0&rU$#+bPNuBn(uyY-i#xcCmH)N|KVCclPJnA}wfqKMj$GM1FCFlG+8 zp+9Bpuqd}AfWkd-2tsQkSXtF3f1n&sJ3R{L8?ptw{J|BbR4L!ni$q}V&Joxd=U^(@ z$7j^=L@`bNnBLf`wPeHh5B6R%WrNbpmWP(Ho@$ygoUDtFQ1ftME3~bPhQ_|u$E(tcJqxwudGF0Yn5xYtgbii=QntNhtTp8M4`0H zWA#(XJC|PGTi^tJA}+&56lrhn#nYHG+@oOH9i&v} zAoEvN$<=32&8XX%+1}gf8E;H4_Ni6{+)d?O6tRMW7Tcrc7OVQAD4#o#4?ILY=45iaxQAyxN* znx#z1C6OeF$c0?EimdQJRZ{j5znTGDHIte?OP%-@j|M~wg?6OQK%6%_%`VEJn00mG ztu!9?Tu4jpKm0?-e~mo=vTMN8d4u_}Yk#-EH>TDKKER4#O%ePu-d!*GwuasS^URBU zS8k^AH7Mahd}KgC3CqX72Sy=&uU{g)-!xdAK~fR-p|s$Y_|pNbH;kPBVaj57`~#KW zE9N;g`xCfS&y=E!r*LLWt9NJ;Z1X_BYX&c`ghP|w@w4hee+!~PG}nU5S6XN#cu|y97F#TTGF&8F7{yeR$ch^#)~#Bo$fo(w1;Y!<$fHw=FIl7H)-K#dg+5?!u++s zSB-1X`25m3_jk+OHArx)t5W=TuNz^&#Ve96J@mV(fAD@ZdwR=+d{!#6a2kj)VjvY? zF$>|bS^pEiBtLeF9KuAmKWw|hKr0NvM*AXMc*0SL*)31_i`zolLmGj4C9YGPu?}P20bpF=16H%vFD# zYzVShxM(RZZXXS}DD0Qvq+FrRw{w=^#4>%?PZcq+)o_kzmhs$1&-#f;6!SBetGz|y z_ES1X3}KEUWV0TpyV{>)>WIXu;2mdUxFg+mf3p5wtF#BYCi9CYMC;ejK02iMnCI$y zHf7b~*Urk=-^t95& zv{UlVtJpd<8cj$@m}1^I%Dixbx-CL{(8iJaymixisjcBbaXo*g=VGenRw_HA8=hI% z0>DbY>c2!-3_|S9^DN#wO!hsY_8wh0e?;6>>%SUETb!TG`s1G3N z$ni4uHAK<;kJt?|a8=?z_O_b~7+6age-IK@FmubLF9*yz$YaLOhhaFZxNbiBBG=_P zEhRaGel2lG5=LHDAr3TcPeACL_WnsxdNg(+sD#wUX;^O;Iih!&Oh8^aC0PNcf2~cm zK!ar!dO3Xyn6wu|RZEx?K6?oCxOSUkqQ%YQheK}|4AIP3@0--vnZojZPCHA_;;86M zN@U&2alqZ1*JxR_zmL-3MrSI-ThrqQ*b<@{qW=9v9e;>vhmiKtRk-Vcp?~6rKbK|H z_+;M!e~T)=vHosM=Cbf%zP{aEf7PRYgZ|#)=ozKlS$*iPKKPO`uqSMTjx>Ua^RYla zo;cw^E?)xUI3JmRL%PNsJtptkVGdU9EWI_b{6gW`*q{rBZ?#Z-1tQmM7P1s9pqy79 zTCumn9*wcT#2U>Jzm#^C(feV8o6tl2Dz`q=U=QzCvWSC0X46m|x>HQ8e`i}k@qA%6 zk|9>m24IjMY&EJeKuX%1Mvf7a?3esPuFhY1SG@(!>ut>3+7;U+;9JVp_6fE7zAB%wRH)e`)g%zd7b@X=P%Eje;4+e!aYkV8+cEax9-=tjEvlgGarq zUyHpr)ii^O&ZmA#otJAZ=9%Bd(va63iXHVyuoUjHgH@H$9`2v1`Rnrxr9Y(VLyqPR zY2BkS+s)s(S&3@`LlC8ghzm z@FRXq+ZFU9j&gV8a}+$3ZsP9{NcTtAEajbXV!=N+Su+)ZNr)e7Im(V|p-=kN^p|>s z*3gMywuFg%L1{@{v7U)1-{+{UKl<2DFxygsx841e8tW^>jaNg2kQH!*#>tRrUk5@u)c@_HtUQjIeCl^Xj zHs(tsM_zui=qp%WMLgQn!@Q2WLDcj9TYMWs)`ei{e?M@knpQs7#-){H=!g=PnwZD1 zi-iiwpd?~Vp3WpCokKAZzHpbE=++@*U+0v<;`*z-UVR6XNHixwEzy^ZH<+Y&!CaZT z2Ek1BWbz&lFZbTZOo3RAHc~o?rIBS#N+Tak_=>_sxHeq$p;x$VrSF!1jZj6E zOiLD#f0r{uDM-?=qr4TDuJK}K&;LrA)AcK2Pyfuw z|B3p-|6S7je=@$Xo3Wv@lez8x3j55lv;PYFBc{zfv3v_r~fzU z%eV~wze%6w6enb#b(ht*$CsxUXb+17gaqCKf1MX}s!(|klnGqJg) zpbwWmzjRKkaCRwUX$8JIbrNfRQOQMm#US;J4PYU|obr(8Jlxxhmj=2P|DbOHG;BrR zsWtY32mzc(%E>1Dk|EwFt(IHpGJ$2Ae&2uU6Ie5%?cj5VGzVFPAPBYyF;X8ubVw-X1N@&{ z;ha@Ze*eQ%>YpL-|IJm=$-&&l^gp2r$M#Er(j$bBs#I5_)AsPmKyA|~MHYJ?dmy1i z?wB??Pn_#h=UbC=l7)e2CCnR}9359-4*ND@2n{#8Yj^lX2$m4D8C(ke^0cO4PirFBy>@uDRoWDYoKC7Zpe@BPg zX7QD{^cSq2?sDE(Y8}h!IUVTnOC+|TGi7r2(WMe^)@DPQYc#=2`g;SOm9zb2>I1ua zGRvEeX#p2=FaYdCu&kqm#}A*-k;?&bN(7f}`=6LQKVepLL4klae*pne{CAl3|BW+S zY108)7=b&G*3$M+O@)SpfXKiwe~d^|$IigO%CIgu2*L;^#n8|Vt6F4XsFSl|U7I-I zudtY-zqSWPgc+n=%ZJ^meY2vgdyu0D+_dsYNSf0f3Z7dJ*) z!x(JGf)PqbluC5CyXGPo7Q~e`Rc1AtEUa{6ab2^TTQ2Rot*jI;!N^z`CVE->US~jh4q2EVf3@~9hyVQJ#@ShQpljU6Jjv> z!2*?uEXK9ps>OO4u3?J3$#8-fnk6f2_Hc@|joVVlaq-J>EY4O_Wi%Rw!AR~p!XMiB zDn`ExE+RNwRh_x-gYb8JPQy&R!hh}PwQW@c_SqM8P=d^LgU=$we?FYp3EdL+weY`m z$ZOKtf|!ie#s4Cz23ar$mERF`eF;D<*p_qar?#n<-#a7TW4Q_xZ~m&G&$^F+h3Vy` zb@3w<5>&oX@Yh0=N>18{%&EBBz=2XyA-$e@3c`5F(CJ+av)(y!^0ne zX^xBW3OSNG+huxyf1b*Wzj=tjR-74-nV0lV-M8x1VWu0U6A{4v=5Ak}3s8iXHhH%n zPIUu)AgKX(hs<|CxEARu!ymj}&I_7}-}POyi+Ka%58Xw=n7)HysF{c%%v0}^bxX&z zdFvcROb;~$#7cRE#bVarwBc`nA z1c-`fDY>V&luD5A3|J$BZ|RSH5we9y4dd$X(M;Fm;RX$80ys`(;5@Q&4;Yb!lQ1rS z(!%{`F@Iq-jG58T_ITRI6TFIO-6Sis~tK8y#Hz9~?f8|O)#9~)>{p=K9`lURe`vv`< zZEk?3r;-l>1QY@GU$?ozzuP=o@k{ofSk5im(wuo@=|vWyi>i-}t*FQF8w;WUNkp71 z0YQ9B^MwUUTXG{h2tz#TCr<3INa4Qe4;jFk6&2Y>Epv6z@uvMHyXWQoVRaQB$mBL^ z|Lg9~f8)Da<6xwxZqkCEnZiPYIcvk;{I26{Ej>dK4aGH>xQ&#oeX={Mo-)e2R{mj0 zAXqa;tn&A=R5ZSkRPX3xQQ7SRk@@y#?z_Zb1DPF}R&0mDAKv)Pw2AT?Bf5~ZYbGth zE;{OdI)O#g_A{)QEB2Hz7OO^|p{s_AG~-FCfA%fzi4>wBjE?75f?18N8k5vZ5ov*< z?(+t)bbtGhc>~VG>4Y|+!94jAeiHRy{Y&Z2<#<6G=Ah9yDWXj(g}J~TvVqgoxk&^T zs?ien59INK-dY{XE675b4a+vX!9O7wMS2y?4XR>Va_7#gO_hz~F1RN&XtWwz4<@u1 zf6qU^;^H&gPy>TDAEzBjo=O;5+`?mz4od<$+fFQ%f4R@pX`IIhIV2K1I_Rq>(qk2Z z%b^b0E$c=Q5l2{d&=_j@FGLxiV!YO8M?Zl}>*_497#X2Du{6eFa0Ff+1hhPSJ{?3v zk%Mbb8^vsxTW%yoVS;Z@uOUZJFT@+4f6`>M%waVr*s;2e^QJYBbiGrKR?fa8C=~dT zG4LLGf+^(!hcvS&lf5H`u zKs2IC1%b06PAxw5+42&Bmk$=>{dnNa2vBAvfoaEf$?Lke;}--09&FX33>{1;3$pZf zNUxa>+KC^^9;^_xV0d3Ai$I0F|I0Su=NwPa|6>_Of&c45H~gPMm(`U7;YY}wK9_2Y zI)$d}>EP6(f3V_BaK7%rEF3JY9BA^WUAinf3bd z@&WFH%|d)#v(oux%Vgr^uQ5k(1bHQAvrw!=l_(Ngj(BPx36(C`n?;X)k9i+FsVEu> zsR+mE#15<20%M$SzdaZ<%V!gxRs-;pl{h8AO3_lKf${Y_++6${o{er{%i0? z{|29|3h9PDjQTwqUmabQ<|h89U*>NTsAft5Q5;jVW8RtsUA*xDVK_{+nmD$mk#k-$ z2#u(?tOgV}S(7+?9yPu6A|Xw@f74uIOVgvxnfESwx1?ai$4-qEe`ShQn>g@d>P&jLY<$GjZL)0q{}h>}VhQ;)esxrH3Ihc>G~5591#KO0lW;a|TUGDMI= zm!f2}%ncqkqAh8+e^0xF0}$$-N*vP5Iv8upK`O<%RKraR%8POqlx%4*XW=Nv)ksid z&F{oS#$h}SRn)-HbV_j)x-t@Q9$iFh6bscUEx=gN%(@|&(Nw#7w5W2<6%r=$GSru| znRr}F3fQ~7!&oZ(+j5i>Ek>Zq8Riiwt&-(Ms_UR3g!Aa>e;Q@1g^&={kjsJykww92 zXhvu0Dnz?^O3&3xBIU93MB*m=$%{N1)7>26AS_yj#D`dbeHX3Hl}l6~bP^c)iHkjJ z^IW6lyT$T)%y{A?irqWp_4@NNt`rW$9VPVa6&>?}8m428)bs}#*uZGaC)vK}LW(>`SnUE(c@r7lpUYR(^whWHUNq&uv?5R$a zRQk|p5a*$M?&Ko7sb|bAS$N|B= zZKhj;w(9}ZspiBiS*@30<|_)~(#nsJB_q+8bFHbEZ4z-lJqT_m-2s^JCxbYgX zu@Xh05$Oe!*&r~CeAM)%7-bD%wq#NvgYL@L3E!*$6Ok1gM8q<5DJ6ZnfjP%7iRl+B zMr_#4t#_CfzMm;8^KHGa=^; zf7n*glqd0ia(sMkb=!E`IM=#q$@W(qXS5RwQCpS!3I_3SgFkVRbd-VbYVdUHV#9R> zO#xa%oZi{MCEmE J}_Q3AqDB4Il-7;sZDeb|`(oMk?yipK?g1tkmALY}181{5Gwyn^M(; zAd(Ve(Dc@$ol|~3toy1Hjcg{nlcQz&fG;Ic3G2tJTX4>f@u`=2{{#y1RIfd(PW;0T z1+2KmoiD&0(pc{C+CUw8J#$-Q*PP)(caz3kmgeF z@e33ymg6Pyq)KeWGUhF7e?M&M0Ffr}gW;d%;GljS?!> z#Ij#}c`bF6aSM$`zQN$3lasNxhQ~k1z?NDsqzmi%fE4M`ui0BiY&ZbAf0N*3u_4i9 z+}xx>=`!wMW{i;5syHWPZvkTr1?(5QOsAGq5CZ)Vtk2|>FR9%+&J?*=fr!!2DJMV< zRvqb^PhhO0OyIeu{8Xz5=nMIKO5sPqH@?0tN2Ost|EwQBbGxM%N=u`EMUAFW7b7u;h8~`H_@$H+yf4U9#4$BH*cCZU_l1f4zJmT1vq5Y!Uk=MLv%Qg(RkIubT zT=bCy@neyTo`(T-jD*Onm{ty}@O7i$E+Wc}OQ`~JTU?Xln*fA$hCYsQmLp!cr4XKFzem{S22(j=7rx~MMJ-#fe~s$UsUg$v2(`1Q zhL1HE671}5RWSo7cDI7f8hMtJTw@5qb-&C?9Zg>9(8}R@KAd-j@|4XP`HthF3rXeX zH>j{n@!%X{6F^Wwg8PisfGt-PjgEG6=WjMOPhP!o;EuA4&Fk4GLmNY6e}*{tpdvL} z5VW?%E1yG~{EDN}e-xGDwzUkzfy^0s$`7fliY3S#jlQS6Z!2DQ0HegBdeN5`eDY4C z?PZ_?QTJhfa(QcBS{lCqX^^(QAvErgPA9fKl zt$U?Hi)=(Nl7p^T|I=_@mux{+Q8^l(aAIcS;DSR*AKR^ue`Q0MppzjMhraf@3=WV* z`%KUS#3m#lzL8xxI80o>1htIC*926*psr(OZ7QX14yK^N;0%M_e~h;!CbqE4ci)0r z1(Y|NhYvRy4aA8*c^BOSML)d)(XcMpMx^y1&obfs=H0owvoA4CbWyy>Ye_ySx2CWu zl30bng0#Uxe~Uf9fORf(3;T6J7UP<{k6waSup(I+Zs7C4=w_qd7K}n=0yS8eNH-zI}8C9o;wT=D+XV18lonzwKH~~ z3kv6^@U^E8q6NL`Q$JWGMi2PLg*PHsMV~_MS#P)l%VWkM2eoZQe-pR?Jz7qq&L(ML9`K;gO>2)^3647SCZfeoppQGeU`=$aKZOjfkBC(vjKzH5 zqBgwPG;`))OQ4-YTQq4Fsb6NaJ~FI_?agf$rMu<+c@L3~7Vm3~<@oz#x#6RJOPV$b zs+Tw5;fNP$y)p3_u3dXlW`AQm+n2HQ1?A>-f0Uh*MZUVIK%MVd_g6#f*iU{;aXNT0 zpOt`n3C09!+@%R|e3Ta8u#iFihAR-7#sdx;Mh~NtxTz&eq9l^cBdjd~I%2+8FKK~7 zz@h)=f7$x$s=M76R3IQG`v2Np8vol}HfuoYDIGQQn3^!Wm@vfAfu8=Ez(7b84{4%- ze*i_Jry2>WBZ~Xgd}ee^f|)iYWeTjIS#9RpQTuvnlKQy35g`E~*Gi-2-O^m!xpLhc zxs6_llKGPTv!jk=BJl1dOLy}9!G6L!>H2+p+8eViE0nr^o@UdrA7V{eQ+oq1>Vh3^ z=3U0aAh)Z9FAi5~aA(JoA_W$jC=dE&e@!j(OB5!%wY)QQ@+0)mm$+? z>94@SeI+^)Pc4UddW7p<2**Xr`-|TWcWfNb7-ujp!lMz!sWhFh3-7DvLsB(0Ml`te zEJFvs7Ljmvkz$Go$Aw5RSv4HO)m(_O!b%eB&A3)_;Yvj{V4`uPoI3|R2dMAte+=r3 z9e-#D6PCxuhrXm7IjX>^Aqh7dxN$Xuzv&Wd=VG@TMgDFsP&nzL0cMuzvmP0wEXbyy zN)@Or3D?)~>gp=&eMNCEi+^*>+?n*(@kSDHCQT^yHOQ5nZwd&FV3mO z!?U`Z*Fv_*U}zabIoCv@&ACfOADK82Ee29|GK>pNE^B9U zN_z`h?l5d)W#1Hdte113%9tXHbWm3;BALODDEj+n+h|CjPc-~0QJ2%Qf9GTcAEPCd zmST=~gHd=P9vBRf;V)TN2{l&dXr7u1_{HQwt_W&lK$56BZme}#5P6CO0e&sjlAe;H zylk#*qal+T4ndjbL}eQt$~YI)n(tI|KD2~TjdY;_dy&yGpWLp-Wl_ZJksi4c_QkHB zf2&op7ll#30*GsNDz=)3f9i!eZ^E-OPIS*dW=TTTC)6gE+(_d(3ejHDfdzM_TP|@7 zx3XGW3&3EAlY+lkIwRS}*%@H+;;3}*nex|SK|>!6J6tedWDQZYC&a#v#m076*V<4s z-p)7@^h~%7k592;z`T*YZfw~y>7p<-8WO@b;ZQBCAzv|1cL&69e{9S+xerRcQQqj& zoZI*3>grq+?Qn3oCTNZ#c_ws5r^MXa`7(7uX2J#$t{Zs>6)4GzPVj7qRKt>_QS zF?gUBMPa8Ce5wCk&YJKe#b+D|z=h?@c+ zt|UlWFw;@85X$Q=f$yBN!!bi;|u5KMx*9Voy}B=a0QRaipuP!nvB| zzBT9C3(^OqVf534bz;{fNR{OmOl|(e8mVliK=4RG!qXF{|H9swP#cMQe6h_kD@jsq zFUwqjSi~Hf$~U6HvxWubrlYo4Q}_2>wBAlC&Z62GbmC8Uf4}gfceuM`AEPY{X- zF1-}wvNE&W)WiF-K#!h#I-Vz9Ow&<$K9DR?TCmD#TwQ=2SdW&1)=+-tzsC!MJzk)g zcEvp7u7_w?l#W}NlKCd1p+S2og)K_UlDdb_v;IT51A~#sE2ix(>L6FRN=QXmR!f7t zRC;xWCqeoWe-U0~Vdc1peI`xg0osjeZec=FJg zx&ZVMj^rng3|rxvUTV2YF~OATDEO13TQUKnu0NO&X(kEK{de>uuIRo?Ic#z72=tME z|LD)+r}$hE7}?kF#R$eb^PO1U%tz1xBbas$<0B4le+XA($3;=8BOeqy!@&4x7=QI% z=goKpN3yNQs|3)mgO6OleH8ay6Ou`!Zysg!^@#@Fs{;9VS+Y(hC744bM0FZ5q&Y43 zKY7PY$V~55Kw)877bUav&sZIaJhLbttczJ0t?La*%EtBv;QD?C|%U zG0JJ!e=i=ixGwYDOd%}SHWXs@Gxm#YxXI?DX*iwHh)DEmi)O;u3tHAlsy2 zm*3)2hoj6MapIs_S72nWi|A)|u-rnr12vG#cc>f`xTGYg1SR7ZkIRgJ0VE%MRGM#S zgJK5+%jHL%c-F@T4VT5$(~E{p);;n{{U{Uef5xc_dI9RT>3w72s?I4Wu1STn!yJrT zRY|5S*o(*AF-gU9(&(OPrD84MyS6GjMM@f0@6?`?f}6RQ;oHjM1a}axV(D7VibeRy zYG#fvh<6$6ayPaB=zqL&bfZZWP)TAkymc+egDlPOh#Z(&)UZdmAkdtV}%nMB>f7W;f zzO;exeot=R+NEQC6k5xRC3n!td;>yMlR9xIcFpg}sh%Jkhs7D`o;1Nnt*}UVX%8Y5 zGh2S5ZvR+#B5*BMWoY`TVh=E!(7U_}j!@>cbs+4OKgD-;vmSs!*se5Fr$G9fsH|Vx zsz3te3vYiBUsBAz{525UaWd&|e;WctDS5zKF%Y2_qKgdNm?huvQKDm3Chfjtyonoo zR4JqRj%Pp0{VzWa-@C(jGpdRl!z#FDIAlSH>JWFu#75A@$`o@XM&BWp*#96TYBWK1-csLi_|6Qtb#&bu)#;-f|?5=Bg9tpMAd4Uhu z)AEz$RT(PNsIy^zf9(32NiQ{Xm%mZ_)5V8$DOd7RhUkUF$;TBD=2^WLeD1BgOs?ep zJOTHj)w$XFdg=8`t=HOn^u1a8V*8UH%=a6p5U+CFHZlBq1yeX}rMafNwz?5pHK6H* z;JZ%hQ|#?@UWMJmOR8Y>itfma3iOk0Ayh6Y1*7VL)Z`hXe@hY|D-FV3Iy{;kfX;Ju zATP2#Ea}_>dgzdSBXqj6(@oGOa58(MTn%*F67v);rm$o2hEPEz$SmhNQ*}yxqVaOu zP1BPJFG$3UCD~&2J4?Jc;j9W#xm4d^d>dc?Z+5HzeKkpz(2cSPmvNCZ51gWED~U{^ zB zqgp!c9|OCa$SQ@Sb9^*dujZBre0eg!uA25}+11X=PfW@rq&gbEE@oy>e($lrp04Q7 zE~gQZ26Qc@wQ(+*#L7(Dg8c*FQ#y$=s={F&vmj?gf5CV_=`h_>b{_YE*jPACcZ0D| ze3*>4xySy&_05y!8_t*a$HSl|@idx}@~)QD1Wn7u@^cXLr^K9fruGEC{gwRN9(OvW z;}VX(J9nAm?ZmFniH6{5=5bg$ylvAVJcvPv^(P_sIWEyRxGy-#M@6t*9Yo4!us0cy z%Ri3;e>n=c@7!PXjUVe3Ra1wG+ED@9hY0l*QcH({3p`#lHIe>i^-qfp_eB$m4Z4ZK z4)4E=^El*(d&U0I4tQ%^+tRS@o`mf4mBHIq3bt2xEC^U2f8!w1{Rs$>OVxQPz^gUc zqi0dd&VW@u*>VU@uyN!Ahe$+Hl^iJd5XA{6f0b`hi(fuY3J~8xuU`U&VRD zWiZ3-A2dg+pN?LUXfTAEXP5RTRB{d2@-Ly!@J*ZHamqq_^gzSQ7lzkMvu?ayl;-mH ze^whj4w81h*WC1i+l8A`#V>u|*@3%kUUTfnV8$!DCV4Zvwtk^fymAJfm0TLFu|DxvS_I$^6mySlQ1d;S$5dKy8mu?krK!#n*`%OjPU!IioEt9gyjyOv8z zGxHirA2qdcoP{4zthm3%tj4x@UBwts5%X{&gNFqAD{{jX=X6<#BY zZC`%DZik;~?@3CDy@w<`%I8duprVSog>r1O1+PbNv0UH7wRFx`L1GEd?Jb@efACiH z;)kcuytLc{#`XrI#17p0&*0jR;oH|0TYCo98O!B`q7$%oURgOwY+1QH&4b@(+ZEAr z$}ONO@q(Iic$897U$xQ$DuUVCk{^hYhdc`J9HPv5)Lbd;XA0CJ84m72YdIpkJwhwl z%0`i*V{l_DwtD#h2*0?~iYYmne}efVj`^bzfzQgt^cGC{cfbHB2D<}gJIHiIy$Mq+ zuh3y$tBO{nH){co=#6#M4FPuqnn8qSi(In=-3z#fiA$f2C1hjeAVY)4jF= z|De#kU#&zNvwKz*86dBGMpD(1v1<9zM`clOky@9Q_trDJ72 zS3-lC)yC52!%Mreu(MxtWFOkSnGL&aqiW&x4?S`>qcE1NM(l5|j#dNCKBMF%`;=>>s zM7ZIUYCkuO17&o=0?BL319YBJ*&ds0H;}uygnY$>7!5h$a;ZIVLdQRtE5f59nQw>O_$$@@P`%pCReClE|; z6<)Uhdmp=~-mOI(u94k8SOD869Ez%oLO`-tb<8+N*k-2HY(Qn3qGk=EX!yVSF!6cl`V4SyQZA^8v?~&WmmKj zJhrYImal%@BRrZL&+N}{5jm#3y7R-&Xu`S%y5(kLI~AuKA0on=mzk*DBQ|931RtVT zvYL;kTsA*#UyT3S!*%0E`JX*_40uca`KWj9f0yXLR%h9)DyUJcLkH{CHX;hFNi;jN zX*~Q@fbO{+BG9DY*!d&Jz^5u0t_X<|C4N9wmJWI?<6^Xto8~5_kj1Qqg+YjoEyfEV z|D25@pGplfUHw4~!AT4y0W%3Cep`_ItxgJJwI~~}UFeA>3*@zwMAa?I;}+T;Jwj`m ze}bzL=efa-)vF*AxPn7mkv5JclZ|xEv?}h9n{c*f2t3WPC{ab|k%N^}SW%6IKUV7` zyD(Rj>@LktAv5^riAT3{aqBOC8SMH)<6CeJFW1*Fq zH@PJ6z%sd`YG3Yrq2nK}coN=U6+a)Gf8tC=*Bm;dT&&B@q6?YkM*K&E7OK~W%n2;c zf;W!Xg0utI#RVqrqLU0PX9!q!QOo0(*@JopJc0`v=b2Rv0si>{cvsTQeyLghH2=wl z%!0cMEp@}Ln9u04Q%_;!IqoX(>`c6Ffkqu&_yaha&W2Y2R%W%33oG~fP*l(de<*S- zDDY>|8^(`@z}<~f^Vtz^nS&15NM@3wACKw=3?(RMpC87)@B94l%Z|(%8?;Vf!M;JBrb5%e?U_z%={9G~kotAYm zpD)t09nt(AEIZO@^5>OqT5!Y>e*$U9PZ|5QA|t@xYl_&rGB7Nregp62}X{)ETvQ8!%Myv7*N`o@J^|Cy))gFP`BI;7bsYr*$yvwvt3^R^4fe-Rm~OcG{+`^7`#WZ(ZQyIaOmZWc~PRve(H9rs@GJOiUc^e$$ zY~Si-?>H1xXJqODhAkQ8%DGA9F2+bMn$)K(7=pYWE^{&+BHpn1T38M5IpmLD^>Z(@ zR)MrU{jv9k=NF})(BI|jf1wEv_5b_#aS&J^>lG*vP||;Y%hBY2ZiOgWD`G37_|Ono zK}eGOqe(y)=Nlj)spLZtt2L7=|KTHUf{9`DXlxfxv2g)hm!RQt0-|~c;C+rNl}oOg z7_XwT=P`fcV>D*FC5tsi%w3+jUUD3-+h^U^Ki^jeM}bW2v-dAJe_dIQd!$m@|1pHg zhh7U+B#q*W)=boyzf&#_v229nc92{4dj1$@f3P>wOlA61?vtKWZaoXLtXCajb)`2N zML{bTOiU^sUQBcI>RPX}klR4cmX;NzWoD&k<%s*Bf*OXUZl#z;RHjg4%q%|rYUNsV z_F6>~nXC`czE$*m;HS9)wJ1XVmNLAe!Xm2l^{xjzrcX5y{SE z5y*2zDME2gmWvCf>m=?#bq}2j%|BU;#N2RsdE3YwA@uwjz&lX}9Pp;%piV9C%w;!?0)g(Cn}XE5bE~v^qJ3rq0qk$?M`2=;R?r>+6WZ$4D-M zI4`5gP?uHK(44gexf+?=EbO2rO&f=N2UtUrs#V0*Riu>nq+rz0McqjRL$Pig;@O7z zk@zs#nYUVYb}?uiF&z%wQ$*i99BL*t$~#$N@#v|&fBxWgRlS+w+$UJTrvTIjpa$pi zCq>p`(4p!pew~c{v4~g&s0}iQxTxcVTr2STB35>_lY5u-3r`|iR*R^+NeGe_Fg^4A z-j)VPQId?xzgBN|R`p(OGl1(ZmLBQ2bo;S3VMw}@>(nD>rL%_XvRcEmca%UQr>d>kq(Lh_t1t;07(fm?i(z!4SM2P;86wpZW(+bn&+ zU`$#cL>-I|Pz)xqfVwcFfSGhbn>TIpuUfy%4KoX~z`%Zm9rO(fGI|RsQ=(t~VktoG ze+77f$?5e?<-e~HGA_I`wC%(}Yu=}VisC__^YKp}ijK_MWJ(cQ&~%(_(B)XUE6 z5#DZu^ye2oU5@9X%v;!oQNzji4Eu}ge>L|@D{Jrf*B-qeqF0~Y%S`s$eC&WabL&jB z7aQUX>cH22mO6!H$GKSvB4xU}j8Ei+Rx>-esxoJa=25$Ir$WPEctFKw7q1r0h=c`u z31rMeU{{{WZ}L?vZ;oEMd1nVJyGarihbTB0co^7F-e-UM*F}@zi92!W6BunJf1Vl( zl^G^0#gn^;eD=(W_*N^-tFUjfPbp+vY@#XR zj(L;mV0E#P@yU+i$x2|Oo~h8Sx!}y*h8WxAg@!)M3_)(s)UNhHIy0YoL6fwaEdwvt zp{3gNABC1hWFy!i%K?!dZsBvZ z(aqKMu_-?%V>L86hsEBsUQ~AfR|n~WL(pAVM%V-Eh?!zDywSiQZGWlP zNuD1)@TEZH#97_Og4_?U>p+zCFU&20gnqLYNiqGl;Zc$6%H+QIb|E)N&8LL%aBO; zWdb~8NQup6Xk=4zfO)c##lBi#^%lq0K!{{_)auu1A2v+RaPatA8N8~v6T|$TjF&wR z@hW-72TAfF5?vGv*&EkaQADEKWPdEA79p@rnMd#}8eG_3Z;B`GqCq=($g}DETg1K@ zaZjl_BTVUw0!@|1aj1pL$#@6J@n_nwG}3LGIfhaci8jC^U6ZE>b7uViv~m_OaeeK& zFU6Tbi%VNtwD{m&N-6FXD^MH;x8g1CGU(t?WN z`FeAno$O@qo&Btxowc%7-uGQU^#cD468T@O+U7;orMgyO6ALD8q#8~1Ct|GQXN>i4 zes9U8lz9U}~S9Or)JfskUn0htx{qH9fv`vT43>+3 z&pjgw7_n}zZ^|`xXJ7jqdh}iN4CAJbkgOcZ7fh5{F*;2~%}}E!W!Qwny;jtP=i&3_ zl=Q`C5LYrWME*!x1ymlx-x|QuiJ(!KvWPkhY7uUr6+M5I5=e9soPVIu|3s}YM<$+l z=zK+`_F{<9PP0tkBXmyT?CG`-7CTzfn@pOPYQ3`a&k?TaojNTcTwtvo{Ct3FSP+Ro zu+cwfceDv20Lw8ol#Wz$m0FYjpYtd0S5=jdeS$gub&CU0+uen8i`y2jt?k#|_xYb! zkSI@OSxY-0i0XfyEPuYmY5?4`d*kS8 z#WB|voffMA_M%%Hz$qCXf84@YnU<9~}*lHW@vB z^yv6MFYLDbpTxMv2jwRceOU->Q_z2#nJ6T(epVI|%rS(*ykip96dpM)+IMBXimef0?Av=&CV!h}U0RmFz{!$8nwKAt{tM{37nL2J z$rE6&z!&s8=j{2JE?i~pqHnG$m2F~efZuoUGc-7eanoQOBAr62OoV)|tUlAWt)tum+Yp7B7OZeD{658)Z=qn$LFA7EC%wI{u~un$ZxnGVbh&G(nVqD#iR|QGBs+p}Fi_;z}Q{)*E?~lMSLSpgyicbh(?}2Yz{?&3|4E zh+HVB22Bm9U>0g-C4z(9wCIwEf)H7~8289r3syk&Y&4uEzos;5(;9W9GLYqWd%Bv+ zs3!Q8GFXOZ7d)5!1YWkO<21lqtEPI*qm@NBu>7MH$P$;~m8%_43!>8-sJswKig6%; zrxLl{ydsgD@t&QGCNEcV&AdEO)qe}HHq(pR&#{#BLZj`bir`9$At=|U-S8}h7?TJE zp5X$MR=sfd0gFGJywqmg$z_B0gJmG)l-CkZD~94n`DLC@6}n$yPxiF+8BK;uYe$@R0V7^CAjtFt-!3I)PhkJlR{gbdhe1ApB2!4cVz zB+b^Ge2#8NP(Y4P^QnxJF(V3!lMyamLnPGUh?{4|;t$V%{|O2|M_PH`ht zl-}>!$@+@NZ!L`*t{(p~%(29Q4842x$91HcqI;rHkdIiWs5;5rJq-o}2kS!Pt%fN> zN%LbmN*vJ1sx2FnT7RDw@0c@rn-X7~Q|mIl4?$tN4u;goY zlY;P8)xAy=iR8g0DGRQKttk>s@|G)1L!L$TSRm3nMo()JCyio{Uqp$_=%(wI#D5Bz z9&(rJm3L44c7LURM8EclG7c&zgGC!CjbN~|>Y;LvNH3W%pl^YH<-ri@%bo55Ja+rV zhmn{Q*v7{cdh=ze+_0fO3F^nyAFqO?)c~`J``}Et9f(^9;?-wf$)(@(xv2a|`xIN@ z(R*!^J{k3RdoKU{i+e-Z+mc=EYa3eUb(!SyNq+_W(fY5wR{6ya&X>1uBAO)AzUF{t@yI;{k<5eo*x1R+_Q~T_Dw-MdI%+wxQ zPo39v(&Zy-%GK`SZ6)sc;bgtV?uP=)c3o8(r739ltn5M%eB_ ze1GAMv4Xdvq7V)XhaEa0wY-29vA6T&Iy?C?KdAet!MaV7j};3>Au*eb_qf->!1S)N zz{l9qX!H#_;dYMbgeD1R)}i%jM|lK8nt@=@JBOGb1z>)k^qlcX^thPayE5&tAsO=^ zdwcXd!ne5ep6$=tyDAVPl%+53QU85frGGg=l63sD{)7DI>p!dio>qg@|5^X365Qdj z+37?iG%spsva_jZHfrvncgMsK%NBC^)lVFPb!LzFEb4oDW!9_PJ3g*PC@1suVs1QP zxT77y_;4nPnwQQ=o?A*=Iuhu(jE86YN&gG=rc8o!w-e zq3<&6EZ3R-&m~PENsV@n!WH)B7k`0k%ne-~0+JSci|4bnBzBAx7`a8k(Ms!?m7<@g z>N#3WZ5Sg7bah7~OMtCOqr^2Jm!CoPYOK2Xs>0d95k}7`n>EBD`QB>iNeTzV@h;`` zu+X}w0qCIR4Vg@NL9A&Q=i;QlVaOUrMd7SS*qu!xUGvz6`~@g7YkO%6JFF zWBkhF@(r~^k|e;7oG8qCzkeg&%nKbMLtK-LcCs|ktIu~wv7F7@=&a%9_LR#+FmczilbkDGWZuda(GfSA7C0m{=E72u-yK0Qg7g}Pf@~2r z8vR&0l9sfo*`wy%HAuIs19|$Jn7ie#VNVTju+}PO(+hJp$gx*kTz}p>{svsvtM`#- z0W}=q_mrun#&kr2-T-Vjgv=oN!DuB3F$N*%oZb4voYy8er%^ zSOa}VY3G9DNpYN8Vz_K9%xHSnFYDjO0hvoe_7?EbqhD12@i_P&EC5U!)BVX$iZ9|7 z@j<{k8%?a|ktiSPHh*3}C-^GM$%1D*X+CKxz_@GrOl-G%*VN&L$F?c$$VDPm%(iLA z?zwiuXe4`q;zX;~eE#k-i|x+W6*o6%5WSvwRF?Fe&+q$7AFsW!`}EHQ9lDeZi;g#k zOZ%BK+JI90k3X=Q%`7U1Cial)V5Gv0}wX(Hn33QUcdC9$)d85Lj zyXd7cN!{<7Dt}Uz8ND}043ac_)wdn|qW()bw}G!NNsM}GEO#8yc>_VBV*2HvI#|Iq z$s~x)P5G;2;8yG|lNl;%NuVI%uN+Cm0%5)$o6n(sTOhev9vX$4O&dt;;f(qRh*edo zdzbkXXSXt%a^z?Xqp`V=-D+#Lj#E$0xWrv0?awWVV1JiGnZ7S~^-G{?Fp50EUPQ%K zFug%?yI@Y=4R7HrCyz!h(GYgj6Qv0=a@}?-n{U_E zvTSDdqLdTkFN*!myW$je78FuTMarbBgU^yl8Ok_Lwha=xoA>CBE6stWkK0mz{X)1dVhQYKa!%*>(4vfnZN?=aMh=&CsF}_?zM4)gV6*Ek9-{OC(Crvw7!@tBUsJ;I+PA_=A z0A2rp@O`>8J&V;`xd6$S4e|Avh|N)<-?P({5u2-vo#7|t(L08o0c->3x3h8@(|z~s-zCb7pZU%U*k zc_gndN^K-cjhh4fo#=2k{mf*9?1SxCgD1E&*MnZsHFx&lszKl8!v7JpVdu!ug##x? zPeaWDOfkF+3->0hD=@!0R>OW55|ji0L>VV&k(wrWTWKA?(xho$sjxUJw5#Ns3x7#% zrc3`AFmsKtYKg8i4DYU3#YK}++?7>o3p7KYV^TJQ&@+cD_4|S7gjPd3x>36AgDlW)@>>7h0EAM}1?en+^25@Ng|JPk-#5ocoka zQtMUcQn^NJ$SmU%XbN3v+G8VA9O}|V<#qKhB9Y3@d5W9aVt$9}t#7-212BJCaA`(a ziFDbOHIHD^4C^OZrQty<+2U_Ro{~6yWGVn95I)8hB}ppzu~y!YuvtDn(iX@eKYxuA zkdR-nYMq`1WE{PDi@Atnsek!sg`nJGJ&owwt!Mu3c8yp)Ki;bF(Qh~U5P|ZO&*p>U zHr5RsskOG;BpvwrF?|t-^NAWawMv)@oe+*aCWd7DxsMTydA9CvZhy&Mv}aY}G}403 zW}h4N)mXnK+{<5Lj|)#bv>+!nQvj(oiM&dk={^HdJ zcEn(cwxh0k;Yp6;$bXguZBQ+V;?uQ8?tI)7v0?_KNQU`i9!ZsJrq|lK1fkf|Wu#SQoqZLUvo{QMa)dSij{8!;=xaHYZT)T=JuVRczODU!}X z7a~ebvgP+;O_3HI%#Fu&x*~Rtez>Ds?EC;2i;iGGu_aeQBY&Fo#!;!hkmv-_k7w!< zrT8#5wlZDaezx2nxiEtzU9mp4QPCF}6Rc>KLFzGubEusj;8ps4^@UP7EBq6^PM!O~ zBJegiNPu@Y1tl|mM@};rMn6oes3-8cgbv!Sq(xXfSAWSF!TdoaUqjHDogd8-SAUpL z${NNJ+NUov(|_RZP6|%TAx<3adbbOs9w;{(CnOz$s zsL~Zk=6gNh6FNr1Q>1dPW)}`LGRdS#a=c>HCu6u@=GiAqNceMfU$MiE4CP}-JPLJK zgqgZHEE%Q!Z7z`d! z;%(Ie(HcQ{dYZot6q!=MRG39s`^O-6QneG8+kZ4{d499>Jkn7N>es(*Z|$z~+<;2S zNa|NKmqzd};SlJu;XZ|nNcT^(gspqvMgi@zhG0kfS)+LKxTIq;s`58QH|vJ_OJKQB z2ybiaKFhnRHDEbS=lRyl9coFh1#;4mpIU(naND(MLK}+Cy6Rc{O^4%--`bAjv|iOQ zpMPBIJ%KUs*SLf1tGY2S5{hZ`OV9d0_Ql6@e)2%_*ipgt4022gx6I^`tQdi>PfQKs zY;vg_2zea$Z(PnoPeE6t~U(ZoDo z`i|b?Bz|S`=gNWMITX>PYuRQ)Tw$2%c7O4%w~}>HHxs^p^#RWwd(%M~bvYB>On!KS zc8KYW>>p?ertT~^?v{552tk_TBjz>V-Ev8Y1T&Z)Y?4z_-|3DRcN-m}nRE72#Lm>h z`#3=D{wD=vd0$@#f~0LAL^J*=3IO*w(N*(1;SlFm;h=5`k^XyWM2b36?}HQ`B!6m^ zPYmk|S4f3eWCi5;;5*?U`>o@{5JxTh275HO>1*ojE2P&E0_)4F_wU%#b4J$tilF_K ztX_Nu!+Q?igZ{EHQL&Y=5t1mIr%c zT_it{u|xB6ph-F%>zKgCp-Q|&2B)v!^w$2>cGl^S16dxjZLq<{4uv++#q7!f5xE=A zOsrE)E%CnM)p6QJP^q}coyMvvODqqb^LOE z{XeFLtZY)SeLv1{b8ag7;A4|ux2%eIl&~!0(NK_SXG;Ss43$Qp3d$+S@v}vX_Kxv- zY@(u5G9_NQW1SfsoD(I`!E9S&r8(ul3p{TU=?p*E^4(|@lQxgWQ-5Z9!BlI=H`qYR z|h-Yl8W|q5_&P0c~#g8lqnI3pV4WVMo@0nE(Qqi zxi>yr^8S|LeBo+eu;m87T8cPrzT9>zXkAi9INu3axbz^|^s`nD;TQjk#iKkXe)Rta z)c?Ew7jX3t8+-_4|9>Mtl>c8m`@=RKqWJ!3AOC*|%=fU#hm^WMk|g}!VAefs?;)=3 zkBW)@2Hy72_aPtZk77yxh8FeE_aTnwk31><2F~-)_aSZOk4`E7hCTDp_u)R{KT@Ut zn_b5beIFK}{ZWkY-;|?0^nF;P@<%=5e^asYfBlCCY2`n%dOiC$N#=*X53_)O^hEk^ za)J+iABI8ykMC9bo1o}J--ltPKXOw2n;?^lJUYg|-opRq@I`<0D9hkqSN{dGAY{Rc z3d|0qBj;QI05xQj>+VScbYGJ;?>GXWUz2d}FapG1lcMiA0`Xsy-S0&L0b!FQ@IeA& z*OO=PHv*2=lc4ZZ0*Kp__3$?Wv)hv{@j(Lp-IH=ctI^(q3{ a=aZrAC6jseDgx{1lcn`b2C?Y?0002D^RNp5 delta 25464 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%0A8HDH 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 diff --git a/Assets/AirConsole/scripts/Runtime/Plugin/Android/PluginManager.cs b/Assets/AirConsole/scripts/Runtime/Plugin/Android/PluginManager.cs index b017597b..76913c62 100644 --- a/Assets/AirConsole/scripts/Runtime/Plugin/Android/PluginManager.cs +++ b/Assets/AirConsole/scripts/Runtime/Plugin/Android/PluginManager.cs @@ -18,12 +18,13 @@ public class PluginManager { /// Currently only supports UNITY_ANDROID && !UNITY_EDITOR scenarios. // ReSharper disable once EventNeverSubscribedTo.Global internal event Action OnConnectionUrlReceived; + + internal event Action OnUpdateVolume; + internal event Action OnAudioFocusChange; internal PluginManager(AirConsole airConsole) { - AirConsoleLogger.LogDevelopment(() => $"{nameof(PluginManager)} created."); - GenericUnityPluginCallback pauseCallback = new(HandlePlatformPauseEvent); - + UnityPluginStringCallback callback = new( url => { IsInitialized = true; @@ -32,6 +33,17 @@ internal PluginManager(AirConsole airConsole) { }, error => { AirConsoleLogger.Log(() => $"AndroidDataProvider initialization failed with {error}"); } ); + + GenericUnityPluginCallback onVolumeChangeCallback = new(volume => { + AirConsoleLogger.LogDevelopment(() => $"Volume changed to {volume}"); + OnUpdateVolume?.Invoke(volume); + }); + + GenericUnityPluginCallback onAudioFocusChangeCallback = new(focusEvent => { + AirConsoleLogger.LogDevelopment(() => $"Audio focus event received: {focusEvent}"); + + OnAudioFocusChange?.Invoke(focusEvent); + }); UnityPluginExecutionCallback reloadCallback = new(() => { OnReloadWebview?.Invoke(); }); _service = @@ -39,12 +51,14 @@ internal PluginManager(AirConsole airConsole) { pauseCallback, reloadCallback, Settings.AIRCONSOLE_BASE_URL, - callback); + callback, + onVolumeChangeCallback, + onAudioFocusChangeCallback); _airConsole = airConsole; - _airConsole.UnityPause += OnPause; - _airConsole.UnityResume += OnResume; _airConsole.UnityDestroy += OnDestroy; + + AirConsoleLogger.LogDevelopment(() => $"{nameof(PluginManager)} created."); } internal void ReportPlatformReady() { @@ -52,43 +66,38 @@ internal void ReportPlatformReady() { _service.Call("reportPlatformReady"); } + + internal bool RequestAudioFocus() { + AirConsoleLogger.LogDevelopment(() => "RequestAudioFocus called."); + return _service.Call("requestAudioFocus"); + } + + internal void AbandonAudioFocus() { + AirConsoleLogger.LogDevelopment(() => "AbandonAudioFocus called."); + _service.Call("abandonAudioFocus"); + } // /// // /// Writes client identification related information using the native library // /// // /// The screen connectCode to write. // /// The screen uid to write. - internal void WriteClientIdentification(string connectCode, string uid) { - AirConsoleLogger.LogDevelopment(() => $"WriteClientIdentification w/ connectCode: {connectCode}, uid: {uid}"); - _service?.Call("writeClientIdentification", connectCode, uid); - } - - internal bool IsTV() { - return _service != null && _service.Call("isTV"); - } - internal bool IsAutomotive() { - return _service != null && _service.Call("isAutomotive"); - } - internal bool IsNormalDevice() { - return _service != null && _service.Call("isNormalDevice"); - } - - internal void InitializeOfflineCheck() { - AirConsoleLogger.LogDevelopment(() => "InitializeOfflineCheck called."); - - _service.Call("initializeOfflineCheck"); + internal void WriteClientIdentification(string connectCode, string uid) { + AirConsoleLogger.LogDevelopment(() => + $"WriteClientIdentification w/ connectCode: {connectCode}, uid: {uid}"); + _service?.Call("writeClientIdentification", connectCode, uid); } - private void OnPause() { - AirConsoleLogger.LogDevelopment(() => "OnPause called."); + internal bool IsTV() => _service != null && _service.Call("isTV"); - _service.Call("onPause"); - } + internal bool IsAutomotive() => _service != null && _service.Call("isAutomotive"); + + internal bool IsNormalDevice() => _service != null && _service.Call("isNormalDevice"); - private void OnResume() { - AirConsoleLogger.LogDevelopment(() => "OnResume called."); + internal void InitializeOfflineCheck() { + AirConsoleLogger.LogDevelopment(() => "InitializeOfflineCheck called."); - _service.Call("onResume"); + _service.Call("initializeOfflineCheck"); } private void OnDestroy() { @@ -118,4 +127,4 @@ internal static void SendPlatformMessage(string type) { } } } -} \ No newline at end of file +} From 971422b9c1d3960469ec2e4bf971b3fba51a9ed0 Mon Sep 17 00:00:00 2001 From: marc-n-dream Date: Thu, 11 Dec 2025 10:58:11 +0100 Subject: [PATCH 09/11] F: Integrate android audio focus capabilities and webview reload improvements --- .../AirConsole/examples/basic/AudioManager.cs | 34 ++ ...dioPlayer.cs.meta => AudioManager.cs.meta} | 2 +- .../AirConsole/examples/basic/AudioPlayer.cs | 63 --- Assets/AirConsole/examples/basic/basic.unity | 300 ++++++------ .../BuildAutomation/AndroidGradleProcessor.cs | 66 ++- .../AirConsole/scripts/Runtime/AirConsole.cs | 435 ++++++++++++++---- .../scripts/Tests/EditMode/AirConsoleTests.cs | 4 + 7 files changed, 597 insertions(+), 307 deletions(-) create mode 100644 Assets/AirConsole/examples/basic/AudioManager.cs rename Assets/AirConsole/examples/basic/{AudioPlayer.cs.meta => AudioManager.cs.meta} (83%) delete mode 100644 Assets/AirConsole/examples/basic/AudioPlayer.cs diff --git a/Assets/AirConsole/examples/basic/AudioManager.cs b/Assets/AirConsole/examples/basic/AudioManager.cs new file mode 100644 index 00000000..405c11e5 --- /dev/null +++ b/Assets/AirConsole/examples/basic/AudioManager.cs @@ -0,0 +1,34 @@ +#if !DISABLE_AIRCONSOLE +namespace NDream.AirConsole.Examples { + using NDream.AirConsole; + using UnityEngine; + + /// + /// Example Audio Player that starts playing when the game is ready and stops when the game ends. + /// It also listens to volume changes and adjusts the audio accordingly. + /// + public class AudioManager : MonoBehaviour { + // We are using a Platform Script Defines here to avoid extra code to handle non-Android runtime platforms. +#if UNITY_ANDROID && !UNITY_EDITOR + private void Awake() { + // Until OnReady is called, we don't want any audio from Unity playing as the webview Player Lobby overlay will be shown. + AudioListener.pause = true; + + AirConsole.instance.OnGameAudioFocusChanged += HandleGameAudioFocusChange; + } + + private void OnDestroy() { + if (AirConsole.instance) { + AirConsole.instance.OnGameAudioFocusChanged -= HandleGameAudioFocusChange; + } + } + + private void HandleGameAudioFocusChange(bool hasAudioFocus, float newMaximumVolume) { + AirConsoleLogger.Log(() => $"HandleGameAudioFocusChange({hasAudioFocus},{newMaximumVolume})"); + AudioListener.volume = newMaximumVolume; + AudioListener.pause = !hasAudioFocus; + } +#endif + } +} +#endif diff --git a/Assets/AirConsole/examples/basic/AudioPlayer.cs.meta b/Assets/AirConsole/examples/basic/AudioManager.cs.meta similarity index 83% rename from Assets/AirConsole/examples/basic/AudioPlayer.cs.meta rename to Assets/AirConsole/examples/basic/AudioManager.cs.meta index a2241e10..ab748cc6 100644 --- a/Assets/AirConsole/examples/basic/AudioPlayer.cs.meta +++ b/Assets/AirConsole/examples/basic/AudioManager.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: d33481c3f96324d4bba3e5db8826fd6e +guid: f8eacf087b9954b9bab975cd1a0e968c MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/AirConsole/examples/basic/AudioPlayer.cs b/Assets/AirConsole/examples/basic/AudioPlayer.cs deleted file mode 100644 index f4170267..00000000 --- a/Assets/AirConsole/examples/basic/AudioPlayer.cs +++ /dev/null @@ -1,63 +0,0 @@ -#if !DISABLE_AIRCONSOLE -namespace NDream.AirConsole.Examples { - using NDream.AirConsole; - using UnityEngine; - - /// - /// Example Audio Player that starts playing when the game is ready and stops when the game ends. - /// It also listens to volume changes and adjusts the audio accordingly. - /// - [RequireComponent(typeof(AudioSource))] - public class AudioPlayer : MonoBehaviour { - private AudioSource _audioSource; - - private void Awake() { - _audioSource = GetComponent(); - if (!_audioSource) { - AirConsoleLogger.LogError(() => "AudioPlayer requires an AudioSource component.", this); - enabled = false; - return; - } - - SetupAudioSource(); - AirConsole.instance.onReady += HandleOnReady; - AirConsole.instance.onGameEnd += HandleOnGameEnd; - - // Until OnReady is called, we don't want any audio from Unity playing as the Player Lobby overlay will be shown. - AudioListener.pause = true; - } - - private void SetupAudioSource() { - _audioSource.playOnAwake = false; - _audioSource.loop = true; - _audioSource.volume = 1.0f; - if (!_audioSource.clip) { - _audioSource.clip = Resources.Load("Audio/Music/Happy_1"); - } - } - - private void HandleOnGameEnd() { - // After OnGameEnd is called, we must not play any audio until OnReady is called again. During this time the Player Lobby - // overlay will be shown. - AudioListener.pause = true; - } - - private void HandleOnReady(string code) { - AirConsoleLogger.Log(() => $"OnReady for {code}"); - AudioListener.pause = false; - _audioSource.Play(); - } - - private void HandleAudioVolumeChange(float volume) { - AirConsoleLogger.Log(() => $"Setting volume to {volume}"); - if (volume > 0) { - AudioListener.pause = false; - AudioListener.volume = volume; - _audioSource.Play(); - } else if (Mathf.Approximately(0, volume)) { - AudioListener.pause = true; - } - } - } -} -#endif diff --git a/Assets/AirConsole/examples/basic/basic.unity b/Assets/AirConsole/examples/basic/basic.unity index 5a6e07ed..4e382aa8 100644 --- a/Assets/AirConsole/examples/basic/basic.unity +++ b/Assets/AirConsole/examples/basic/basic.unity @@ -3155,6 +3155,7 @@ GameObject: m_Component: - component: {fileID: 841124342} - component: {fileID: 841124341} + - component: {fileID: 841124343} m_Layer: 0 m_Name: AirConsole m_TagString: Untagged @@ -3176,7 +3177,7 @@ MonoBehaviour: m_EditorClassIdentifier: controllerHtml: {fileID: 4900000, guid: 24d0ea9f52a200b479f21be5710f94ac, type: 3} autoScaleCanvas: 1 - androidGameVersion: 2025-05-27-12-55-11 + androidGameVersion: 2025-10-14-07-07-52 androidUIResizeMode: 0 webViewLoadingSprite: {fileID: 0} nativeGameSizingSupported: 0 @@ -3199,6 +3200,18 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &841124343 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 841124340} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f8eacf087b9954b9bab975cd1a0e968c, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &878053057 GameObject: m_ObjectHideFlags: 0 @@ -4467,147 +4480,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1064712596} m_CullTransparentMesh: 0 ---- !u!1 &1070081529 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1070081532} - - component: {fileID: 1070081531} - - component: {fileID: 1070081530} - m_Layer: 0 - m_Name: AudioPlayer - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1070081530 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1070081529} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d33481c3f96324d4bba3e5db8826fd6e, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!82 &1070081531 -AudioSource: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1070081529} - m_Enabled: 1 - serializedVersion: 4 - OutputAudioMixerGroup: {fileID: 0} - m_audioClip: {fileID: 8300000, guid: 804632e1e46684476b4ea5f752e8df15, type: 3} - m_PlayOnAwake: 0 - m_Volume: 1 - m_Pitch: 1 - Loop: 1 - Mute: 0 - Spatialize: 0 - SpatializePostEffects: 0 - Priority: 128 - DopplerLevel: 1 - MinDistance: 1 - MaxDistance: 500 - Pan2D: 0 - rolloffMode: 0 - BypassEffects: 0 - BypassListenerEffects: 0 - BypassReverbZones: 0 - rolloffCustomCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - panLevelCustomCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - spreadCustomCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - reverbZoneMixCustomCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 ---- !u!4 &1070081532 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1070081529} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0.36577117, y: -0.17775297, z: 0.030780792} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1087830224 GameObject: m_ObjectHideFlags: 0 @@ -4753,6 +4625,7 @@ GameObject: - component: {fileID: 1158769764} - component: {fileID: 1158769762} - component: {fileID: 1158769761} + - component: {fileID: 1158769766} m_Layer: 0 m_Name: Main Camera m_TagString: MainCamera @@ -4842,6 +4715,19 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1158769766 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1158769760} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a1b5c6dd8de3e4b4fafb3c384af7e1d2, type: 3} + m_Name: + m_EditorClassIdentifier: + targetCamera: {fileID: 1158769764} --- !u!1 &1179297375 GameObject: m_ObjectHideFlags: 0 @@ -5381,6 +5267,134 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1493791325} m_CullTransparentMesh: 0 +--- !u!1 &1506040750 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1506040753} + - component: {fileID: 1506040752} + m_Layer: 0 + m_Name: AudioPlayer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!82 &1506040752 +AudioSource: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1506040750} + m_Enabled: 1 + serializedVersion: 4 + OutputAudioMixerGroup: {fileID: 0} + m_audioClip: {fileID: 8300000, guid: 804632e1e46684476b4ea5f752e8df15, type: 3} + m_PlayOnAwake: 1 + m_Volume: 1 + m_Pitch: 1 + Loop: 1 + Mute: 0 + Spatialize: 0 + SpatializePostEffects: 0 + Priority: 128 + DopplerLevel: 1 + MinDistance: 1 + MaxDistance: 500 + Pan2D: 0 + rolloffMode: 0 + BypassEffects: 0 + BypassListenerEffects: 0 + BypassReverbZones: 0 + rolloffCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + panLevelCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + spreadCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + reverbZoneMixCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!4 &1506040753 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1506040750} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.36577117, y: -0.17775297, z: 0.030780792} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1521427270 GameObject: m_ObjectHideFlags: 0 @@ -7698,4 +7712,4 @@ SceneRoots: - {fileID: 607279077} - {fileID: 1179297379} - {fileID: 535473225} - - {fileID: 1070081532} + - {fileID: 1506040753} diff --git a/Assets/AirConsole/scripts/Editor/BuildAutomation/AndroidGradleProcessor.cs b/Assets/AirConsole/scripts/Editor/BuildAutomation/AndroidGradleProcessor.cs index 3167aca3..8d898f34 100644 --- a/Assets/AirConsole/scripts/Editor/BuildAutomation/AndroidGradleProcessor.cs +++ b/Assets/AirConsole/scripts/Editor/BuildAutomation/AndroidGradleProcessor.cs @@ -4,6 +4,7 @@ namespace NDream.AirConsole.Editor { using System.Collections.Generic; using System.IO; using System.Linq; + using System.Text.RegularExpressions; internal abstract class AndroidGradleProcessor { private const string PROGUARD_CLASSMEMBERS @@ -11,11 +12,68 @@ private const string PROGUARD_CLASSMEMBERS internal static void Execute(string basePath) { UpdateMainGradleProperties(Path.GetFullPath(Path.Combine(basePath, "..")), "gradle.properties"); - UpdateMainGradleTemplate(Path.GetFullPath(basePath), "build.gradle"); + + UpdateLibraryGradleTemplate(Path.GetFullPath(basePath), "build.gradle"); UpdateProGuard(Path.GetFullPath(basePath), "proguard-unity.txt"); AirConsoleLogger.LogDevelopment(() => "Updated gradle files for AirConsole Android build"); } + private static void UpdateMainGradleTemplate(string basePath, string buildGradle) { + string[] lines = File.ReadAllLines(Path.Combine(basePath, buildGradle)); + + Regex applicationVersionExtractor + = new(@"id 'com.android.application' version '(?\d+)\.(?\d+)\.(?\d+)' apply false"); + Regex libraryVersionVersionExtractor + = new(@"id 'com.android.library' version '(?\d+)\.(?\d+)\.(?\d+)' apply false"); + bool updated = false; + for (int i = 0; i < lines.Length; i++) { + // regex to check the used gradle version + Match match = applicationVersionExtractor.Match(lines[i]); + if (match.Success) { + if (int.Parse(match.Groups["Major"].Value) < 8 + || int.Parse(match.Groups["Minor"].Value) < 1 + || int.Parse(match.Groups["Build"].Value) < 1) { + lines[i] = "id 'com.android.application' version '8.1.1' apply false"; + updated = true; + } + } else { + match = libraryVersionVersionExtractor.Match(lines[i]); + if (match.Success) { + if (int.Parse(match.Groups["Major"].Value) < 8 + || int.Parse(match.Groups["Minor"].Value) < 1 + || int.Parse(match.Groups["Build"].Value) < 1) { + lines[i] = "id 'com.android.library' version '8.1.1' apply false"; + updated = true; + } + } + } + } + + if (updated) { + File.WriteAllLines(Path.Combine(basePath, buildGradle), lines); + AirConsoleLogger.LogDevelopment(() => "Updated gradle main template"); + } + } + + private static void UpdateGradleWrapperVersion(string basePath, string gradleWrapperProperties) { + string[] lines = File.ReadAllLines(Path.Combine(basePath, gradleWrapperProperties)); + Regex versionExtractor + = new(@"^distributionUrl=.*/gradle-(?\d+)\.(?\d+)\.(?\d+)-bin.zip$"); + for (int i = 0; i < lines.Length; i++) { + // regex to check the used gradle version + Match match = versionExtractor.Match(lines[i]); + if (lines[i].StartsWith("distributionUrl=") && match.Success + && (int.Parse(match.Groups["Major"].Value) < 8 + || int.Parse(match.Groups["Minor"].Value) < 1 + || int.Parse(match.Groups["Build"].Value) < 1)) { + lines[i] = "distributionUrl=https\\://services.gradle.org/distributions/gradle-8.1.1-bin.zip"; + File.WriteAllLines(Path.Combine(basePath, gradleWrapperProperties), lines); + AirConsoleLogger.LogDevelopment(() => $"Updated gradle wrapper to {lines[i]}"); + return; + } + } + } + private static void UpdateProGuard(string basePath, string proguardUnityTxt) { string filePath = Path.Combine(basePath, proguardUnityTxt); string fileText = File.ReadAllText(filePath); @@ -27,7 +85,7 @@ private static void UpdateProGuard(string basePath, string proguardUnityTxt) { File.WriteAllText(filePath, fileText); } - private static void UpdateMainGradleTemplate(string basePath, string gradleTemplateName) { + private static void UpdateLibraryGradleTemplate(string basePath, string gradleTemplateName) { string gradleTemplatePath = Path.Combine(basePath, gradleTemplateName); string[] initialLines = File.ReadAllText(gradleTemplatePath) .Replace("\r\n", "\n") @@ -72,6 +130,10 @@ private static void UpdateMainGradleProperties(string basePath, string gradlePro lines = "# AirConsole\nandroid.useAndroidX=true\n\n# Unity provided\n" + lines; } + if (!lines.Contains("android.suppressUnsupportedCompileSdk")) { + lines += "\nandroid.suppressUnsupportedCompileSdk=35,34"; + } + if (lines != initialLines) { File.WriteAllText(gradlePropertiesPath, lines); AirConsoleLogger.LogDevelopment(() => diff --git a/Assets/AirConsole/scripts/Runtime/AirConsole.cs b/Assets/AirConsole/scripts/Runtime/AirConsole.cs index 652ed02e..bda49b8b 100644 --- a/Assets/AirConsole/scripts/Runtime/AirConsole.cs +++ b/Assets/AirConsole/scripts/Runtime/AirConsole.cs @@ -1,19 +1,20 @@ #if !UNITY_EDITOR && UNITY_ANDROID #define AIRCONSOLE_ANDROID_RUNTIME #endif -using UnityEngine; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System; -using System.Diagnostics; -using NDream.AirConsole.Android.Plugin; -using WebSocketSharp.Server; -using Newtonsoft.Json.Linq; -using UnityEngine.Serialization; -using Debug = UnityEngine.Debug; -using UnityEngine.SceneManagement; namespace NDream.AirConsole { + using NDream.AirConsole.Android.Plugin; + using Newtonsoft.Json.Linq; + using System.Collections.Generic; + using System.Collections.ObjectModel; + using System.Diagnostics; + using System.Threading; + using System; + using UnityEngine.SceneManagement; + using UnityEngine.Serialization; + using UnityEngine; + using WebSocketSharp.Server; + public enum StartMode { VirtualControllers, Debug, @@ -62,6 +63,13 @@ public enum AndroidUIResizeMode { public delegate void OnResume(); + /// + /// Used to notify the game about changes to audio focus and maximum allowed volume. + /// + /// True, if the application has AudioFocus. Otherwise the application should stop all audio playback e.g. AudioListener.pause = !hasAudioFocus + /// The received volume is a float value between 0.0 (muted) and 1.0 (maximum volume). + public delegate void OnGameAudioFocusChanged(bool hasAudioFocus, float newMaximumVolume); + /// /// Gets called when the safe area of the screen changes. /// This event provides information about the visible area of the screen where your @@ -72,7 +80,6 @@ public enum AndroidUIResizeMode { public class AirConsole : MonoBehaviour { #region airconsole unity config - [Tooltip("The controller html file for your game")] public UnityEngine.Object controllerHtml; @@ -109,13 +116,11 @@ public class AirConsole : MonoBehaviour { [Tooltip("Used as local IP instead of your public IP in Unity Editor. Use this to use the controller together with ngrok")] public string LocalIpOverride; - #endregion #if !DISABLE_AIRCONSOLE #region airconsole api - // ReSharper disable MemberCanBePrivate.Global UnusedMember.Global /// @@ -261,6 +266,17 @@ public static AirConsole instance { /// public event OnResume onResume; + /// + /// Used to notify the game about changes to audio focus and maximum allowed volume. + /// This must be implemented for Android based games and must be registered before OnReady is invoked. + /// + /// True, if the application has AudioFocus. Otherwise the application should stop all audio playback e.g. AudioListener.pause = !hasAudioFocus + /// The received volume is a float value between 0.0 (muted) and 1.0 (maximum volume). + public event OnGameAudioFocusChanged OnGameAudioFocusChanged; + + private bool _canHaveAudioFocus = true; + private bool _ignoreAudioFocusLoss = true; + internal event Action UnityDestroy; internal event Action UnityResume; internal event Action UnityPause; @@ -358,7 +374,7 @@ public int GetDeviceId() { /// are active players by calling getActivePlayerDeviceIds(). /// The screen can call this function every time a game round starts. /// - /// The maximum number of controllers that should + /// The maximum number of controllers that should /// get a player number assigned. public void SetActivePlayers(int max_players = -1) { if (!IsAirConsoleUnityPluginReady()) { @@ -926,9 +942,7 @@ public void StoreHighScore(string level_name, string level_version, float score, /// /// Gets thrown when you call an API method before OnReady was called. /// - public class NotReadyException : SystemException { - public NotReadyException() : base() { } - } + public class NotReadyException : SystemException { } /// public class WebViewObject : MonoBehaviour { +#if UNITY_ANDROID + WebViewCallback callback; +#endif Callback onJS; Callback onError; Callback onHttpError; @@ -76,6 +80,11 @@ public class WebViewObject : MonoBehaviour Callback onAudioFocusChanged; bool paused; bool visibility; + + // Thread-safe event queue infrastructure + private static int _mainThreadId = -1; + private readonly ConcurrentQueue _eventQueue = new ConcurrentQueue(); + bool alertDialogEnabled; bool scrollBounceEnabled; int mMarginLeft; @@ -114,21 +123,42 @@ public class WebViewObject : MonoBehaviour NetworkReachability? androidNetworkReachability0 = null; #endif - void OnApplicationPause(bool paused) - { + private void OnApplicationPause(bool paused) { + // Temporarily disable pausing to ensure the event queue is processed + this.paused = false; + ProcessEventQueue(); + this.paused = paused; + if (webView == null) return; - // if (!paused && mKeyboardVisibleHeight > 0) - // { - // webView.Call("SetVisibility", false); - // mResumedTimestamp = Time.realtimeSinceStartup; - // } webView.Call("OnApplicationPause", paused); } - void Update() - { + /// + /// Called when the component is disabled. Flushes any remaining events in the queue. + /// + private void OnDisable() { + // Flush remaining events before component destruction + // Temporarily unpause to allow processing + var wasPaused = paused; + paused = false; + ProcessEventQueue(); + paused = wasPaused; + } + + /// + /// Called when the application is about to quit. Flushes any remaining events. + /// + void OnApplicationQuit() { + // Final flush before app closes + var wasPaused = paused; + paused = false; + ProcessEventQueue(); + paused = wasPaused; + } + + private void Update() { // NOTE: // // When OnApplicationPause(true) is called and the app is in closing, webView.Call(...) @@ -155,227 +185,75 @@ void Update() return; #if UNITYWEBVIEW_ANDROID_ENABLE_NAVIGATOR_ONLINE var t = Time.time; - if (t - 1.0f >= androidNetworkReachabilityCheckT0) - { + if (t - 1.0f >= androidNetworkReachabilityCheckT0) { androidNetworkReachabilityCheckT0 = t; var androidNetworkReachability = Application.internetReachability; - if (androidNetworkReachability0 != androidNetworkReachability) - { + if (androidNetworkReachability0 != androidNetworkReachability) { androidNetworkReachability0 = androidNetworkReachability; webView.Call("SetNetworkAvailable", androidNetworkReachability != NetworkReachability.NotReachable); } } #endif - if (mResumedTimestamp != 0.0f && Time.realtimeSinceStartup - mResumedTimestamp > 0.5f) - { + if (mResumedTimestamp != 0.0f && Time.realtimeSinceStartup - mResumedTimestamp > 0.5f) { mResumedTimestamp = 0.0f; webView.Call("SetVisibility", mVisibility); } - if (Screen.height != mLastScreenHeight) - { + if (Screen.height != mLastScreenHeight) { mLastScreenHeight = Screen.height; webView.Call("EvaluateJS", "(function() {var e = document.activeElement; if (e != null && e.tagName.toLowerCase() != 'body') {e.blur(); e.focus();}})()"); } - for (;;) { - if (webView == null) - break; - var s = webView.Call("GetMessage"); - if (s == null) - break; - var i = s.IndexOf(':', 0); - if (i == -1) - continue; - switch (s.Substring(0, i)) { - case "CallFromJS": - CallFromJS(s.Substring(i + 1)); - break; - case "CallOnError": - CallOnError(s.Substring(i + 1)); - break; - case "CallOnHttpError": - CallOnHttpError(s.Substring(i + 1)); - break; - case "CallOnLoaded": - CallOnLoaded(s.Substring(i + 1)); - break; - case "CallOnStarted": - CallOnStarted(s.Substring(i + 1)); - break; - case "CallOnHooked": - CallOnHooked(s.Substring(i + 1)); - break; - case "CallOnAudioFocusChanged": - CallOnAudioFocusChanged(s.Substring(i + 1)); - break; - case "SetKeyboardVisible": - SetKeyboardVisible(s.Substring(i + 1)); - break; - case "RequestFileChooserPermissions": - RequestFileChooserPermissions(); - break; - } - } - } - - /// - /// Updates the tracked keyboard height when the native plugin reports visibility changes. - /// - /// Keyboard height, in pixels, supplied by the Android plugin. - public void SetKeyboardVisible(string keyboardVisibleHeight) - { - if (BottomAdjustmentDisabled()) - { - return; - } - var keyboardVisibleHeight0 = mKeyboardVisibleHeight; - var keyboardVisibleHeight1 = Int32.Parse(keyboardVisibleHeight); - if (keyboardVisibleHeight0 != keyboardVisibleHeight1) - { - mKeyboardVisibleHeight = keyboardVisibleHeight1; - SetMargins(mMarginLeft, mMarginTop, mMarginRight, mMarginBottom, mMarginRelative); - } - } - /// - /// Requests runtime storage permissions required by the Android file chooser implementation. - /// - public void RequestFileChooserPermissions() - { - var permissions = new List(); - using (var version = new AndroidJavaClass("android.os.Build$VERSION")) - { - if (version.GetStatic("SDK_INT") >= 33) - { - if (!Permission.HasUserAuthorizedPermission("android.permission.READ_MEDIA_IMAGES")) - { - permissions.Add("android.permission.READ_MEDIA_IMAGES"); - } - if (!Permission.HasUserAuthorizedPermission("android.permission.READ_MEDIA_VIDEO")) - { - permissions.Add("android.permission.READ_MEDIA_VIDEO"); - } - if (!Permission.HasUserAuthorizedPermission("android.permission.READ_MEDIA_AUDIO")) - { - permissions.Add("android.permission.READ_MEDIA_AUDIO"); - } - } - else - { - if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead)) - { - permissions.Add(Permission.ExternalStorageRead); - } - if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite)) - { - permissions.Add(Permission.ExternalStorageWrite); - } - } - } - if (!Permission.HasUserAuthorizedPermission(Permission.Camera)) - { - permissions.Add(Permission.Camera); - } - if (permissions.Count > 0) - { -#if UNITY_2020_2_OR_NEWER - var grantedCount = 0; - var deniedCount = 0; - var callbacks = new PermissionCallbacks(); - callbacks.PermissionGranted += (permission) => - { - grantedCount++; - if (grantedCount + deniedCount == permissions.Count) - { - StartCoroutine(CallOnRequestFileChooserPermissionsResult(grantedCount == permissions.Count)); - } - }; - callbacks.PermissionDenied += (permission) => - { - deniedCount++; - if (grantedCount + deniedCount == permissions.Count) - { - StartCoroutine(CallOnRequestFileChooserPermissionsResult(grantedCount == permissions.Count)); - } - }; - callbacks.PermissionDeniedAndDontAskAgain += (permission) => - { - deniedCount++; - if (grantedCount + deniedCount == permissions.Count) - { - StartCoroutine(CallOnRequestFileChooserPermissionsResult(grantedCount == permissions.Count)); - } - }; - Permission.RequestUserPermissions(permissions.ToArray(), callbacks); -#else - StartCoroutine(RequestFileChooserPermissionsCoroutine(permissions.ToArray())); -#endif - } - else - { - StartCoroutine(CallOnRequestFileChooserPermissionsResult(true)); - } + // Process any events queued from background threads + ProcessEventQueue(); } #if UNITY_2020_2_OR_NEWER #else int mRequestPermissionPhase; - IEnumerator RequestFileChooserPermissionsCoroutine(string[] permissions) - { - foreach (var permission in permissions) - { + IEnumerator RequestFileChooserPermissionsCoroutine(string[] permissions) { + foreach (var permission in permissions) { mRequestPermissionPhase = 0; Permission.RequestUserPermission(permission); // waiting permission dialog that may not be opened. - for (var i = 0; i < 8 && mRequestPermissionPhase == 0; i++) - { + for (var i = 0; i < 8 && mRequestPermissionPhase == 0; i++) { yield return new WaitForSeconds(0.25f); } - if (mRequestPermissionPhase == 0) - { + if (mRequestPermissionPhase == 0) { // permission dialog was not opened. continue; } - while (mRequestPermissionPhase == 1) - { + while (mRequestPermissionPhase == 1) { yield return new WaitForSeconds(0.3f); } } yield return new WaitForSeconds(0.3f); var granted = 0; - foreach (var permission in permissions) - { - if (Permission.HasUserAuthorizedPermission(permission)) - { + foreach (var permission in permissions) { + if (Permission.HasUserAuthorizedPermission(permission)) { granted++; } } StartCoroutine(CallOnRequestFileChooserPermissionsResult(granted == permissions.Length)); } - void OnApplicationFocus(bool hasFocus) - { - if (hasFocus) - { - if (mRequestPermissionPhase == 1) - { + void OnApplicationFocus(bool hasFocus) { + if (hasFocus) { + if (mRequestPermissionPhase == 1) { mRequestPermissionPhase = 2; } } else { - if (mRequestPermissionPhase == 0) - { + if (mRequestPermissionPhase == 0) { mRequestPermissionPhase = 1; } } } #endif - private IEnumerator CallOnRequestFileChooserPermissionsResult(bool granted) - { - for (var i = 0; i < 3; i++) - { + private IEnumerator CallOnRequestFileChooserPermissionsResult(bool granted) { + for (var i = 0; i < 3; i++) { yield return null; } webView.Call("OnRequestFileChooserPermissionsResult", granted); @@ -386,14 +264,11 @@ private IEnumerator CallOnRequestFileChooserPermissionsResult(bool granted) /// /// Original bottom margin in pixels. /// The adjusted bottom margin accounting for keyboard height. - public int AdjustBottomMargin(int bottom) - { - if (BottomAdjustmentDisabled()) - { + public int AdjustBottomMargin(int bottom) { + if (BottomAdjustmentDisabled()) { return bottom; } - else if (mKeyboardVisibleHeight <= 0) - { + else if (mKeyboardVisibleHeight <= 0) { return bottom; } else @@ -403,10 +278,8 @@ public int AdjustBottomMargin(int bottom) using (var activity = unityClass.GetStatic("currentActivity")) using (var player = activity.Get("mUnityPlayer")) using (var view = player.Call("getView")) - using (var rect = new AndroidJavaObject("android.graphics.Rect")) - { - if (view.Call("getGlobalVisibleRect", rect)) - { + using (var rect = new AndroidJavaObject("android.graphics.Rect")) { + if (view.Call("getGlobalVisibleRect", rect)) { int h0 = rect.Get("bottom"); view.Call("getWindowVisibleDisplayFrame", rect); int h1 = rect.Get("bottom"); @@ -417,8 +290,7 @@ public int AdjustBottomMargin(int bottom) } } - private bool BottomAdjustmentDisabled() - { + private bool BottomAdjustmentDisabled() { #if UNITYWEBVIEW_ANDROID_FORCE_MARGIN_ADJUSTMENT_FOR_KEYBOARD return false; #else @@ -432,8 +304,12 @@ private bool BottomAdjustmentDisabled() IntPtr webView; #endif - void Awake() - { + private void Awake() { + // Capture the main thread ID for thread-safe event queueing + if (_mainThreadId == -1) { + _mainThreadId = Thread.CurrentThread.ManagedThreadId; + } + Debug.Log($"Initializing WebViewObject v{VersionInfo.VERSION}"); alertDialogEnabled = true; scrollBounceEnabled = true; @@ -443,6 +319,21 @@ void Awake() mMarginBottomComputed = -9999; } + /// + /// Secondary event drain called after all Update() methods have run. + /// Catches any events queued during the current frame's Update cycle. + /// + private void LateUpdate() { + ProcessEventQueue(); + } + + /// + /// Catches any events queued during the current frame's FixedUpdate cycle. + /// + private void FixedUpdate() { + ProcessEventQueue(); + } + /// /// Gets a value indicating whether the soft keyboard is currently visible. /// @@ -627,11 +518,9 @@ private static extern void _CWebViewPlugin_Reload( /// Determines whether the current platform exposes a compatible WebView implementation. /// /// true when the underlying native plugin can be instantiated; otherwise false. - public static bool IsWebViewAvailable() - { + public static bool IsWebViewAvailable() { #if !UNITY_EDITOR && UNITY_ANDROID - using (var plugin = new AndroidJavaObject("net.gree.unitywebview.CWebViewPlugin")) - { + using (var plugin = new AndroidJavaObject("net.gree.unitywebview.CWebViewPlugin")) { return plugin.CallStatic("IsWebViewAvailable"); } #else @@ -680,9 +569,7 @@ public void Init( bool wkAllowsLinkPreview = true, bool wkAllowsBackForwardNavigationGestures = true, // editor - bool separated = false, - Callback audioFocusChanged = null) - { + bool separated = false) { #if UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX _CWebViewPlugin_InitStatic( Application.platform == RuntimePlatform.OSXEditor, @@ -695,7 +582,6 @@ public void Init( onLoaded = ld; onHooked = hooked; onCookies = cookies; - onAudioFocusChanged = audioFocusChanged; #if UNITY_WEBGL #if !UNITY_EDITOR _gree_unity_webview_init(name); @@ -741,13 +627,16 @@ public void Init( webView.SetStatic("forceBringToFront", true); #endif webView.Call("Init", name, transparent, zoom, androidForceDarkMode, ua, radius); + + // Set up direct callback for zero-delay event delivery + callback = new (this); + webView.Call("SetCallback", callback); #else Debug.LogError("Webview is not supported on this platform."); #endif } - public void Destroy() - { + private void OnDestroy() { #if UNITY_WEBGL #if !UNITY_EDITOR _gree_unity_webview_destroy(name); @@ -782,8 +671,7 @@ public void Destroy() /// /// Pauses WebView timers and rendering to match Unity's lifecycle. /// - public void Pause() - { + public void Pause() { #if UNITY_WEBPLAYER || UNITY_WEBGL //TODO: UNSUPPORTED #elif UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_EDITOR_LINUX @@ -805,8 +693,7 @@ public void Pause() /// /// Resumes WebView timers previously paused via . /// - public void Resume() - { + public void Resume() { #if UNITY_WEBPLAYER || UNITY_WEBGL //TODO: UNSUPPORTED #elif UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_EDITOR_LINUX @@ -828,8 +715,7 @@ public void Resume() /// /// Desired centre position in screen pixels (historically anchored to lower-left). /// Desired width and height of the WebView in pixels. - public void SetCenterPositionWithScale(Vector2 center, Vector2 scale) - { + public void SetCenterPositionWithScale(Vector2 center, Vector2 scale) { #if UNITY_WEBPLAYER || UNITY_WEBGL //TODO: UNSUPPORTED #elif UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_EDITOR_LINUX @@ -851,8 +737,7 @@ public void SetCenterPositionWithScale(Vector2 center, Vector2 scale) /// Right margin in pixels or percentage. /// Bottom margin in pixels or percentage. /// When true, margins are interpreted as percentages of the screen size. - public void SetMargins(int left, int top, int right, int bottom, bool relative = false) - { + public void SetMargins(int left, int top, int right, int bottom, bool relative = false) { #if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_EDITOR_LINUX //TODO: UNSUPPORTED return; @@ -887,8 +772,7 @@ public void SetMargins(int left, int top, int right, int bottom, bool relative = mr = right; mb = bottom; #elif UNITY_IPHONE - if (relative) - { + if (relative) { float w = (float)Screen.width; float h = (float)Screen.height; ml = left / w; @@ -904,20 +788,17 @@ public void SetMargins(int left, int top, int right, int bottom, bool relative = mb = bottom; } #elif UNITY_ANDROID - if (relative) - { + if (relative) { float w = (float)Screen.width; float h = (float)Screen.height; int iw = Display.main.systemWidth; int ih = Display.main.systemHeight; - if (!Screen.fullScreen) - { + if (!Screen.fullScreen) { using (var unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) using (var activity = unityClass.GetStatic("currentActivity")) using (var player = activity.Get("mUnityPlayer")) using (var view = player.Call("getView")) - using (var rect = new AndroidJavaObject("android.graphics.Rect")) - { + using (var rect = new AndroidJavaObject("android.graphics.Rect")) { view.Call("getDrawingRect", rect); iw = rect.Call("width"); ih = rect.Call("height"); @@ -942,8 +823,7 @@ public void SetMargins(int left, int top, int right, int bottom, bool relative = && mt == mMarginTopComputed && mr == mMarginRightComputed && mb == mMarginBottomComputed - && r == mMarginRelativeComputed) - { + && r == mMarginRelativeComputed) { return; } mMarginLeftComputed = ml; @@ -975,16 +855,13 @@ public void SetMargins(int left, int top, int right, int bottom, bool relative = /// Shows or hides the WebView while keeping its state intact. /// /// true to make the WebView visible; otherwise false. - public void SetVisibility(bool v) - { + public void SetVisibility(bool v) { #if UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX - if (bg != null) - { - bg.gameObject.active = v; + if (bg != null) { + bg.gameObject.SetActive(v); } #endif - if (GetVisibility() && !v) - { + if (GetVisibility() && !v) { EvaluateJS("if (document && document.activeElement) document.activeElement.blur();"); } #if UNITY_WEBGL @@ -1015,8 +892,7 @@ public void SetVisibility(bool v) /// /// Gets the last visibility flag applied to the WebView. /// - public bool GetVisibility() - { + public bool GetVisibility() { return visibility; } @@ -1024,8 +900,7 @@ public bool GetVisibility() /// Toggles native scroll bar rendering where supported. /// /// true to show scroll bars; otherwise false. - public void SetScrollbarsVisibility(bool v) - { + public void SetScrollbarsVisibility(bool v) { #if UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX // TODO: UNSUPPORTED #elif UNITY_IPHONE @@ -1046,7 +921,7 @@ public void SetScrollbarsVisibility(bool v) /// /// Whether debugging should be enabled. public void EnableWebviewDebugging(bool enabled) { -#if UNITY_ANDROID && !(UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX) +#if UNITY_ANDROID && !UNITY_EDITOR if (webView == null) { return; } @@ -1061,8 +936,7 @@ public void EnableWebviewDebugging(bool enabled) { /// Enables or disables user interaction with the WebView surface. /// /// Whether touch input is forwarded to the WebView. - public void SetInteractionEnabled(bool enabled) - { + public void SetInteractionEnabled(bool enabled) { #if UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX // TODO: UNSUPPORTED #elif UNITY_IPHONE @@ -1082,8 +956,7 @@ public void SetInteractionEnabled(bool enabled) /// Controls whether JavaScript alert/confirm/prompt dialogs are permitted. /// /// true to allow dialogs; otherwise false. - public void SetAlertDialogEnabled(bool e) - { + public void SetAlertDialogEnabled(bool e) { #if UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX // TODO: UNSUPPORTED #elif UNITY_IPHONE @@ -1103,8 +976,7 @@ public void SetAlertDialogEnabled(bool e) /// /// Gets the cached alert dialog enable flag. /// - public bool GetAlertDialogEnabled() - { + public bool GetAlertDialogEnabled() { return alertDialogEnabled; } @@ -1112,8 +984,7 @@ public bool GetAlertDialogEnabled() /// Toggles bouncing/elastic scrolling on supported platforms. /// /// true to enable bouncing, otherwise false. - public void SetScrollBounceEnabled(bool e) - { + public void SetScrollBounceEnabled(bool e) { #if UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX // TODO: UNSUPPORTED #elif UNITY_IPHONE @@ -1131,8 +1002,7 @@ public void SetScrollBounceEnabled(bool e) /// /// Gets the cached bounce/elastic scrolling flag. /// - public bool GetScrollBounceEnabled() - { + public bool GetScrollBounceEnabled() { return scrollBounceEnabled; } @@ -1140,8 +1010,7 @@ public bool GetScrollBounceEnabled() /// Grants or revokes camera access for WebRTC and file input elements. /// /// Whether the WebView should expose camera capture to web content. - public void SetCameraAccess(bool allowed) - { + public void SetCameraAccess(bool allowed) { #if UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX // TODO: UNSUPPORTED #elif UNITY_IPHONE @@ -1159,8 +1028,7 @@ public void SetCameraAccess(bool allowed) /// Grants or revokes microphone access for WebRTC and audio capture flows. /// /// Whether the WebView should expose microphone capture to web content. - public void SetMicrophoneAccess(bool allowed) - { + public void SetMicrophoneAccess(bool allowed) { #if UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX // TODO: UNSUPPORTED #elif UNITY_IPHONE @@ -1177,24 +1045,22 @@ public void SetMicrophoneAccess(bool allowed) /// /// Forces the Android plugin to request audio focus back for Unity's audio subsystem. /// - public void RequestUnityAudioFocus() - { + public void RequestUnityAudioFocus() { #if UNITY_ANDROID && !UNITY_EDITOR if (webView == null) return; - webView.Call("RequestUnityAudioFocus"); + webView.Call("requestUnityAudioFocus"); #endif } /// /// Relinquishes Unity's audio focus so WebView media can take control. /// - public void AbandonUnityAudioFocus() - { + public void AbandonUnityAudioFocus() { #if UNITY_ANDROID && !UNITY_EDITOR if (webView == null) return; - webView.Call("AbandonUnityAudioFocus"); + webView.Call("abandonUnityAudioFocus"); #endif } @@ -1205,8 +1071,7 @@ public void AbandonUnityAudioFocus() /// Regex pattern for URLs that should be blocked. /// Regex pattern that triggers hook callbacks. /// true if the operation is supported on the current platform. - public bool SetURLPattern(string allowPattern, string denyPattern, string hookPattern) - { + public bool SetURLPattern(string allowPattern, string denyPattern, string hookPattern) { #if UNITY_WEBPLAYER || UNITY_WEBGL //TODO: UNSUPPORTED return false; @@ -1228,8 +1093,7 @@ public bool SetURLPattern(string allowPattern, string denyPattern, string hookPa /// Navigates the WebView to the specified URL. /// /// Absolute or relative URL to load. - public void LoadURL(string url) - { + public void LoadURL(string url) { if (string.IsNullOrEmpty(url)) return; #if UNITY_WEBGL @@ -1256,8 +1120,7 @@ public void LoadURL(string url) /// /// HTML markup to display. /// Base URL used for resolving relative paths. - public void LoadHTML(string html, string baseUrl) - { + public void LoadHTML(string html, string baseUrl) { if (string.IsNullOrEmpty(html)) return; if (string.IsNullOrEmpty(baseUrl)) @@ -1281,8 +1144,7 @@ public void LoadHTML(string html, string baseUrl) /// Evaluates JavaScript inside the current WebView context. /// /// Script source to execute. - public void EvaluateJS(string js) - { + public void EvaluateJS(string js) { #if UNITY_WEBGL #if !UNITY_EDITOR _gree_unity_webview_evaluateJS(name, js); @@ -1305,8 +1167,7 @@ public void EvaluateJS(string js) /// /// Returns the current navigation progress percentage where supported. /// - public int Progress() - { + public int Progress() { #if UNITY_WEBPLAYER || UNITY_WEBGL //TODO: UNSUPPORTED return 0; @@ -1327,8 +1188,7 @@ public int Progress() /// /// Returns whether the WebView has a previous page in its navigation history. /// - public bool CanGoBack() - { + public bool CanGoBack() { #if UNITY_WEBPLAYER || UNITY_WEBGL //TODO: UNSUPPORTED return false; @@ -1349,8 +1209,7 @@ public bool CanGoBack() /// /// Returns whether the WebView can navigate forward in its history stack. /// - public bool CanGoForward() - { + public bool CanGoForward() { #if UNITY_WEBPLAYER || UNITY_WEBGL //TODO: UNSUPPORTED return false; @@ -1371,8 +1230,7 @@ public bool CanGoForward() /// /// Navigates to the previous entry in the WebView history if available. /// - public void GoBack() - { + public void GoBack() { #if UNITY_WEBPLAYER || UNITY_WEBGL //TODO: UNSUPPORTED #elif UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_EDITOR_LINUX @@ -1391,8 +1249,7 @@ public void GoBack() /// /// Navigates to the next entry in the WebView history if available. /// - public void GoForward() - { + public void GoForward() { #if UNITY_WEBPLAYER || UNITY_WEBGL //TODO: UNSUPPORTED #elif UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_EDITOR_LINUX @@ -1411,8 +1268,7 @@ public void GoForward() /// /// Reloads the current WebView page. /// - public void Reload() - { + public void Reload() { #if UNITY_WEBPLAYER || UNITY_WEBGL //TODO: UNSUPPORTED #elif UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_EDITOR_LINUX @@ -1428,62 +1284,184 @@ public void Reload() #endif } + #region Thread-Safe Event Queue + + /// + /// Checks if the current thread is the Unity main thread. + /// + /// True if executing on the main thread, false otherwise. + private bool IsMainThread() { + if (_mainThreadId == -1) + return false; // Defensive: queue if main thread ID not yet captured + return Thread.CurrentThread.ManagedThreadId == _mainThreadId; + } + + /// + /// Processes all queued events on the main thread. + /// Called from Update(), LateUpdate(), and lifecycle hooks. + /// Safe to call multiple times (idempotent). + /// + private void ProcessEventQueue() { + if (paused) + return; + + WebViewEvent evt; + while (_eventQueue.TryDequeue(out evt)) { + try + { + DispatchEvent(evt); + } + catch (Exception ex) { + Debug.LogError($"WebView event handler exception for {evt.Type}: {ex}"); + // Continue processing remaining events + } + } + } + + /// + /// Dispatches a single event to the appropriate callback. + /// + /// The event to dispatch. + private void DispatchEvent(WebViewEvent evt) { + switch (evt.Type) { + case WebViewEvent.EventType.Message: + CallFromJS(evt.Payload); + break; + case WebViewEvent.EventType.Error: + CallOnError(evt.Payload); + break; + case WebViewEvent.EventType.HttpError: + CallOnHttpError(evt.Payload); + break; + case WebViewEvent.EventType.Started: + CallOnStarted(evt.Payload); + break; + case WebViewEvent.EventType.Loaded: + CallOnLoaded(evt.Payload); + break; + case WebViewEvent.EventType.Hooked: + CallOnHooked(evt.Payload); + break; + case WebViewEvent.EventType.Cookies: + CallOnCookies(evt.Payload); + break; + case WebViewEvent.EventType.AudioFocusChanged: + CallOnAudioFocusChanged(evt.Payload); + break; + case WebViewEvent.EventType.KeyboardHeightChanged: + SetKeyboardVisible(evt.Payload); + break; + case WebViewEvent.EventType.FileChooserPermissions: + RequestFileChooserPermissions(); + break; + case WebViewEvent.EventType.Unknown: + Debug.LogWarning($"Unknown WebView event received: {evt.Payload}"); + break; + } + } + + /// + /// Enqueues an event from a native bridge message string. + /// Thread-safe - can be called from any thread. + /// + /// The raw message in "Type:Payload" format. + public void EnqueueEvent(string message) { + var evt = WebViewEvent.FromNativeMessage(message); + if (evt != null) { + _eventQueue.Enqueue(evt); + } + } + + /// + /// Enqueues a WebViewEvent directly. + /// Thread-safe - can be called from any thread. + /// + /// The event to enqueue. + public void EnqueueEvent(WebViewEvent evt) { + if (evt != null) { + _eventQueue.Enqueue(evt); + } + } + + /// + /// Gets the current number of events in the queue. + /// Useful for debugging and performance monitoring. + /// + public int EventQueueCount => _eventQueue.Count; + + #endregion + /// /// Invokes the registered error callback with the supplied message. + /// Thread-safe: if called from a background thread, the event is queued for main thread processing. /// /// Descriptive error message. - public void CallOnError(string error) - { - if (onError != null) - { + public void CallOnError(string error) { + if (!IsMainThread()) { + EnqueueEvent(WebViewEvent.Error(error)); + return; + } + if (onError != null) { onError(error); } } /// /// Invokes the registered HTTP error callback for the given status information. + /// Thread-safe: if called from a background thread, the event is queued for main thread processing. /// /// HTTP error payload (status code or detail string). - public void CallOnHttpError(string error) - { - if (onHttpError != null) - { + public void CallOnHttpError(string error) { + if (!IsMainThread()) { + EnqueueEvent(WebViewEvent.HttpError(error)); + return; + } + if (onHttpError != null) { onHttpError(error); } } /// /// Forwards navigation-start notifications to the Unity listener. + /// Thread-safe: if called from a background thread, the event is queued for main thread processing. /// /// URL that began loading. - public void CallOnStarted(string url) - { - if (onStarted != null) - { + public void CallOnStarted(string url) { + if (!IsMainThread()) { + EnqueueEvent(WebViewEvent.Started(url)); + return; + } + if (onStarted != null) { onStarted(url); } } /// /// Forwards navigation-complete notifications to the Unity listener. + /// Thread-safe: if called from a background thread, the event is queued for main thread processing. /// /// URL that finished loading. - public void CallOnLoaded(string url) - { - if (onLoaded != null) - { + public void CallOnLoaded(string url) { + if (!IsMainThread()) { + EnqueueEvent(WebViewEvent.Loaded(url)); + return; + } + if (onLoaded != null) { onLoaded(url); } } /// /// Dispatches JavaScript messages received from the native bridge to managed listeners. + /// Thread-safe: if called from a background thread, the event is queued for main thread processing. /// /// Message payload supplied by the page. - public void CallFromJS(string message) - { - if (onJS != null) - { + public void CallFromJS(string message) { + if (!IsMainThread()) { + EnqueueEvent(WebViewEvent.Message(message)); + return; + } + if (onJS != null) { #if !UNITY_ANDROID #if UNITY_2018_4_OR_NEWER message = UnityWebRequest.UnEscapeURL(message); @@ -1497,12 +1475,15 @@ public void CallFromJS(string message) /// /// Dispatches URL-hook notifications to managed listeners. + /// Thread-safe: if called from a background thread, the event is queued for main thread processing. /// /// Hooked URL reported by the native layer. - public void CallOnHooked(string message) - { - if (onHooked != null) - { + public void CallOnHooked(string message) { + if (!IsMainThread()) { + EnqueueEvent(WebViewEvent.Hooked(message)); + return; + } + if (onHooked != null) { #if !UNITY_ANDROID #if UNITY_2018_4_OR_NEWER message = UnityWebRequest.UnEscapeURL(message); @@ -1516,34 +1497,138 @@ public void CallOnHooked(string message) /// /// Delivers cookie information retrieved from the WebView. + /// Thread-safe: if called from a background thread, the event is queued for main thread processing. /// /// Cookie string in standard HTTP header format. - public void CallOnCookies(string cookies) - { - if (onCookies != null) - { + public void CallOnCookies(string cookies) { + if (!IsMainThread()) { + EnqueueEvent(WebViewEvent.Cookies(cookies)); + return; + } + if (onCookies != null) { onCookies(cookies); } } /// /// Dispatches audio focus state transitions emitted by the Android plugin. + /// Thread-safe: if called from a background thread, the event is queued for main thread processing. /// /// State identifier such as webview-start or unity-gain. - public void CallOnAudioFocusChanged(string state) - { - if (onAudioFocusChanged != null) - { + public void CallOnAudioFocusChanged(string state) { + if (!IsMainThread()) { + EnqueueEvent(WebViewEvent.AudioFocusChanged(state)); + return; + } + if (onAudioFocusChanged != null) { onAudioFocusChanged(state); } } + /// + /// Updates the tracked keyboard height when the native plugin reports visibility changes. + /// + /// Keyboard height, in pixels, supplied by the Android plugin. + public void SetKeyboardVisible(string keyboardVisibleHeight) { +#if !UNITY_ANDROID || UNITY_EDITOR || UNITY_STANDALONE + return; +#else + if (!IsMainThread()) { + EnqueueEvent(WebViewEvent.KeyboardHeightChanged(keyboardVisibleHeight)); + return; + } + if (BottomAdjustmentDisabled()) { + return; + } + var keyboardVisibleHeight0 = mKeyboardVisibleHeight; + var keyboardVisibleHeight1 = Int32.Parse(keyboardVisibleHeight); + if (keyboardVisibleHeight0 != keyboardVisibleHeight1) { + mKeyboardVisibleHeight = keyboardVisibleHeight1; + SetMargins(mMarginLeft, mMarginTop, mMarginRight, mMarginBottom, mMarginRelative); + } +#endif + } + + /// + /// Requests runtime storage permissions required by the Android file chooser implementation. + /// + public void RequestFileChooserPermissions() { +#if !UNITY_ANDROID || UNITY_EDITOR || UNITY_STANDALONE + return; +#else + if (!IsMainThread()) { + EnqueueEvent(WebViewEvent.FileChooserPermissions()); + return; + } + var permissions = new List(); + using (var version = new AndroidJavaClass("android.os.Build$VERSION")) { + if (version.GetStatic("SDK_INT") >= 33) { + if (!Permission.HasUserAuthorizedPermission("android.permission.READ_MEDIA_IMAGES")) { + permissions.Add("android.permission.READ_MEDIA_IMAGES"); + } + if (!Permission.HasUserAuthorizedPermission("android.permission.READ_MEDIA_VIDEO")) { + permissions.Add("android.permission.READ_MEDIA_VIDEO"); + } + if (!Permission.HasUserAuthorizedPermission("android.permission.READ_MEDIA_AUDIO")) { + permissions.Add("android.permission.READ_MEDIA_AUDIO"); + } + } + else + { + if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead)) { + permissions.Add(Permission.ExternalStorageRead); + } + if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite)) { + permissions.Add(Permission.ExternalStorageWrite); + } + } + } + if (!Permission.HasUserAuthorizedPermission(Permission.Camera)) { + permissions.Add(Permission.Camera); + } + if (permissions.Count > 0) { +#if UNITY_2020_2_OR_NEWER + var grantedCount = 0; + var deniedCount = 0; + var callbacks = new PermissionCallbacks(); + callbacks.PermissionGranted += (permission) => + { + grantedCount++; + if (grantedCount + deniedCount == permissions.Count) { + StartCoroutine(CallOnRequestFileChooserPermissionsResult(grantedCount == permissions.Count)); + } + }; + callbacks.PermissionDenied += (permission) => + { + deniedCount++; + if (grantedCount + deniedCount == permissions.Count) { + StartCoroutine(CallOnRequestFileChooserPermissionsResult(grantedCount == permissions.Count)); + } + }; + callbacks.PermissionDeniedAndDontAskAgain += (permission) => + { + deniedCount++; + if (grantedCount + deniedCount == permissions.Count) { + StartCoroutine(CallOnRequestFileChooserPermissionsResult(grantedCount == permissions.Count)); + } + }; + Permission.RequestUserPermissions(permissions.ToArray(), callbacks); +#else + StartCoroutine(RequestFileChooserPermissionsCoroutine(permissions.ToArray())); +#endif + } + else + { + StartCoroutine(CallOnRequestFileChooserPermissionsResult(true)); + } +#endif + } + /// /// Overrides the audio focus change callback at runtime. /// /// Callback invoked for audio focus transitions. - public void SetOnAudioFocusChanged(Callback cb) - { + public void SetOnAudioFocusChanged(Callback cb) { onAudioFocusChanged = cb; } @@ -1552,8 +1637,7 @@ public void SetOnAudioFocusChanged(Callback cb) /// /// HTTP header key. /// Header value. - public void AddCustomHeader(string headerKey, string headerValue) - { + public void AddCustomHeader(string headerKey, string headerValue) { #if UNITY_WEBPLAYER || UNITY_WEBGL //TODO: UNSUPPORTED #elif UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_EDITOR_LINUX @@ -1574,8 +1658,7 @@ public void AddCustomHeader(string headerKey, string headerValue) /// /// HTTP header key to query. /// The stored header value or null if none is found. - public string GetCustomHeaderValue(string headerKey) - { + public string GetCustomHeaderValue(string headerKey) { #if UNITY_WEBPLAYER || UNITY_WEBGL //TODO: UNSUPPORTED return null; @@ -1597,8 +1680,7 @@ public string GetCustomHeaderValue(string headerKey) /// Removes a custom header so it is no longer appended to web requests. /// /// HTTP header key to remove. - public void RemoveCustomHeader(string headerKey) - { + public void RemoveCustomHeader(string headerKey) { #if UNITY_WEBPLAYER || UNITY_WEBGL #elif UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_EDITOR_LINUX #elif UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX || UNITY_IPHONE @@ -1615,8 +1697,7 @@ public void RemoveCustomHeader(string headerKey) /// /// Clears all previously added custom headers. /// - public void ClearCustomHeader() - { + public void ClearCustomHeader() { #if UNITY_WEBPLAYER || UNITY_WEBGL //TODO: UNSUPPORTED #elif UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_EDITOR_LINUX @@ -1635,8 +1716,7 @@ public void ClearCustomHeader() /// /// Deletes persistent WebView cookies where supported. /// - public void ClearCookies() - { + public void ClearCookies() { #if UNITY_WEBPLAYER || UNITY_WEBGL //TODO: UNSUPPORTED #elif UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_EDITOR_LINUX @@ -1656,8 +1736,7 @@ public void ClearCookies() /// /// Flushes the in-memory cookie store to disk. /// - public void SaveCookies() - { + public void SaveCookies() { #if UNITY_WEBPLAYER || UNITY_WEBGL //TODO: UNSUPPORTED #elif UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_EDITOR_LINUX @@ -1678,8 +1757,7 @@ public void SaveCookies() /// Requests the cookie string for a given URL. Result is returned via . /// /// URL whose cookies should be retrieved. - public void GetCookies(string url) - { + public void GetCookies(string url) { #if UNITY_WEBPLAYER || UNITY_WEBGL //TODO: UNSUPPORTED #elif UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_EDITOR_LINUX @@ -1702,8 +1780,7 @@ public void GetCookies(string url) /// /// HTTP basic auth user name. /// HTTP basic auth password. - public void SetBasicAuthInfo(string userName, string password) - { + public void SetBasicAuthInfo(string userName, string password) { #if UNITY_WEBPLAYER || UNITY_WEBGL //TODO: UNSUPPORTED #elif UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_EDITOR_LINUX @@ -1725,8 +1802,7 @@ public void SetBasicAuthInfo(string userName, string password) /// Clears the WebView cache, optionally including disk-backed resources. /// /// When true, disk cache entries are also removed. - public void ClearCache(bool includeDiskFiles) - { + public void ClearCache(bool includeDiskFiles) { #if UNITY_WEBPLAYER || UNITY_WEBGL //TODO: UNSUPPORTED #elif UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_EDITOR_LINUX @@ -1747,8 +1823,7 @@ public void ClearCache(bool includeDiskFiles) /// Adjusts the Android text zoom scaling factor (100 is default size). /// /// Text zoom percentage. - public void SetTextZoom(int textZoom) - { + public void SetTextZoom(int textZoom) { #if UNITY_WEBPLAYER || UNITY_WEBGL //TODO: UNSUPPORTED #elif UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_EDITOR_LINUX @@ -1763,18 +1838,14 @@ public void SetTextZoom(int textZoom) } #if UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX - void OnApplicationFocus(bool focus) - { - if (!focus) - { + void OnApplicationFocus(bool focus) { + if (!focus) { hasFocus = false; } } - void Start() - { - if (canvas != null) - { + void Start() { + if (canvas != null) { var g = new GameObject(gameObject.name + "BG"); g.transform.parent = canvas.transform; bg = g.AddComponent(); @@ -1782,8 +1853,7 @@ void Start() } } - void Update() - { + void Update() { if (bg != null) { bg.transform.SetAsLastSibling(); } @@ -1823,6 +1893,10 @@ void Update() break; } } + + // Process any events queued from background threads + ProcessEventQueue(); + if (webView == IntPtr.Zero || !visibility) return; bool refreshBitmap = (Time.frameCount % bitmapRefreshCycle == 0); @@ -1849,8 +1923,7 @@ void Update() } } - void UpdateBGTransform() - { + void UpdateBGTransform() { if (bg != null) { bg.rectTransform.anchorMin = Vector2.zero; bg.rectTransform.anchorMax = Vector2.zero; @@ -1871,8 +1944,7 @@ void UpdateBGTransform() /// public int devicePixelRatio = 1; - void OnGUI() - { + void OnGUI() { if (webView == IntPtr.Zero || !visibility) return; switch (Event.current.type) { diff --git a/Assets/Packager/Editor/Packager.cs b/Assets/Packager/Editor/Packager.cs index 8549ac1f..59515623 100644 --- a/Assets/Packager/Editor/Packager.cs +++ b/Assets/Packager/Editor/Packager.cs @@ -80,27 +80,6 @@ private static void ExportPackage(string outputPath) { Debug.ClearDeveloperConsole(); AirConsoleLogger.Log(() => $"Exporting to {outputPath}"); - string packageCache = Path.GetFullPath(Path.Combine(Application.dataPath, "..", "Library", "PackageCache")); - string webviewPackagePath = - Directory.GetDirectories(packageCache).FirstOrDefault(d => d.Contains("com.airconsole.unity-webview")); - - if (!Directory.Exists(webviewPackagePath)) { - EditorUtility.DisplayDialog("Error", "Can not find airconsole webview package", "OK"); - AirConsoleLogger.LogError(() => "Can not find airconsole webview package"); - return; - } - - string webviewPackagePathAssets = Path.Combine(webviewPackagePath, "Assets"); - - string targetPath = Path.GetFullPath(Path.Combine(Application.dataPath, "AirConsole", "unity-webview")); - DeleteAssetDatabaseDirectory(targetPath); - AssetDatabase.Refresh(); - - EditorApplication.LockReloadAssemblies(); - - MoveSubDirectories(webviewPackagePathAssets, targetPath); - File.Move(Path.Combine(webviewPackagePath, "unity-webview.asmdef"), Path.Combine(targetPath, "unity-webview.asmdef")); - File.Move(Path.Combine(webviewPackagePath, "unity-webview.asmdef.meta"), Path.Combine(targetPath, "unity-webview.asmdef.meta")); RemoveControllersFromWebGlTemplates(); RemoveAirConsolePreferences(); AssetDatabase.Refresh(); @@ -110,13 +89,8 @@ private static void ExportPackage(string outputPath) { CollectPackageInclusionPaths(packagePath, out IEnumerable packageInclusionPaths); AssetDatabase.ExportPackage(packageInclusionPaths.ToArray(), outputPath, ExportPackageOptions.Recurse); - File.Move(Path.Combine(targetPath, "unity-webview.asmdef"), Path.Combine(webviewPackagePath, "unity-webview.asmdef")); - File.Move(Path.Combine(targetPath, "unity-webview.asmdef.meta"), Path.Combine(webviewPackagePath, "unity-webview.asmdef.meta")); - MoveSubDirectories(targetPath, webviewPackagePathAssets); - DeleteAssetDatabaseDirectory(targetPath); CleanupCodePackage(); - AssetDatabase.Refresh(); - EditorApplication.UnlockReloadAssemblies(); + Debug.ClearDeveloperConsole(); } From c558666d67ebe984b27a72e68fa86912c19a83f3 Mon Sep 17 00:00:00 2001 From: marc-n-dream Date: Thu, 11 Dec 2025 11:02:22 +0100 Subject: [PATCH 11/11] d: Update Changelog --- CHANGELOG.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0ecff21..113a4753 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ This includes security related updates like requiring fixed Unity versions and i ### Changed +- **Android Support**: Better dependency handling through gradle processor integration. Removal of included files where possible. - **Android Target SDK:** Increased to 35 to meet Google Play requirements per Nov 1, 2025. - **Unity Minimum Versions:** The Unity minimum versions have been updated to match `CVE-2025-59489` fix versions. - **Code Style**: Examples and scripts have been aligned on style. @@ -26,6 +27,9 @@ This includes security related updates like requiring fixed Unity versions and i - **Unity API:** `OnMaximumVolumeChanged` event to notify when the games maximum volume must be changed. - **Android:** After the last device disconnects, the webview is reset along the game state. - **Android:** Add support to override the game version used in a previously built android game through intent extras with adb. +- **Android:** The support for native game sizing is communicated +- **Android Audio Focus:** Improvements to match the expected behavior on Android Automotive. +- **Android Audio Focus:** Drive maximum volume based on Android system requirements to avoid pausing when losing audio focus. ### Removed @@ -161,15 +165,15 @@ For completeness as this is a 2.5.0 rerelease, the 2.5.0 release notes are repea #71) - Added :gift_heart:: Partner specific highscore - New rank `partner` for `RequestHighScores` that will limit the response to highscores the player has achieve on the same partner. See - the [partner specific high score section of the high score guide](https://developers.airconsole.com/#!/guides/highscore#partner) + the [partner specific high score section of the high score guide](https://developers.airconsole.com/#!/guides/highscore#partner) - Added :gift_heart:: Multi-screen multiplayer API [see Multi-screen multiplayer guide](https://developers.airconsole.com/#!/guides/multiplayer) - provides information to enable online multiplayer matchmaking against screens in the same car as well screens in the same type of - partner environment (e.g. car brand). + partner environment (e.g. car brand). - Added :gift_heart:: New capability: Player Silencing [see Handling Players connecting guide](https://developers.airconsole.com/#!/guides/player_silencing) - Support for Player Silencing in the AirConsole component. For more information visit - the [AirConsole Player Silencing Guide](https://developers.airconsole.com/#!/guides/player_silencing). + the [AirConsole Player Silencing Guide](https://developers.airconsole.com/#!/guides/player_silencing). - Added :gift_heart:: Support for EMSDK_PYTHON when building for WebGL in Unity 2019 which requires python2 that needs to be manually installed on OSX Ventura / Sonoma. If your python2 is not in `/usr/local/bin/python2` you can update the path in the AirConsole Settings window. @@ -202,15 +206,15 @@ Gameplay rounds are controlled through AirConsole's setActivePlayers API. - Added :gift_heart:: Partner specific highscore - New rank `partner` for `RequestHighScores` that will limit the response to highscores the player has achieve on the same partner. See - the [partner specific high score section of the high score guide](https://developers.airconsole.com/#!/guides/highscore#partner) + the [partner specific high score section of the high score guide](https://developers.airconsole.com/#!/guides/highscore#partner) - Added :gift_heart:: Multi-screen multiplayer API [see Multi-screen multiplayer guide](https://developers.airconsole.com/#!/guides/multiplayer) - provides information to enable online multiplayer matchmaking against screens in the same car as well screens in the same type of - partner environment (e.g. car brand). + partner environment (e.g. car brand). - Added :gift_heart:: New capability: Player Silencing [see Handling Players connecting guide](https://developers.airconsole.com/#!/guides/player_silencing) - Support for Player Silencing in the AirConsole component. For more information visit - the [AirConsole Player Silencing Guide](https://developers.airconsole.com/#!/guides/player_silencing). + the [AirConsole Player Silencing Guide](https://developers.airconsole.com/#!/guides/player_silencing). - Added :gift_heart:: Support for EMSDK_PYTHON when building for WebGL in Unity 2019 which requires python2 that needs to be manually installed on OSX Ventura / Sonoma. If your python2 is not in `/usr/local/bin/python2` you can update the path in the AirConsole Settings window. /// Requests persistent data from the servers. @@ -1103,20 +1117,22 @@ public void SetImmersiveState(JObject payload) { #endregion #region unity functions - protected void Awake() { if (instance != this) { Destroy(gameObject); } - // always set default object name - // important for unity webgl communication + // Always set default object name + // Critical for unity webgl communication gameObject.name = "AirConsole"; if (IsAndroidRuntime) { AirConsoleLogger.Log(() => $"Launching build {Application.version} in Unity v{Application.unityVersion}"); + defaultScreenHeight = Screen.height; _pluginManager = new PluginManager(this); + _pluginManager.OnUpdateVolume += HandleOnMaxVolumeChanged; + _pluginManager.OnAudioFocusChange += HandleNativeAudioFocusChanged; } } @@ -1172,7 +1188,7 @@ private void InitWebSockets() { wsListener.onResume += OnResume; if (Application.isEditor) { - // start websocket connection + // Start websocket and connection wsServer = new WebSocketServer(Settings.webSocketPort); wsServer.AddWebSocketService(Settings.WEBSOCKET_PATH, () => wsListener); wsServer.Start(); @@ -1182,7 +1198,7 @@ private void InitWebSockets() { } } else { if (Application.platform == RuntimePlatform.WebGLPlayer) { - // call external javascript init function + // Call external javascript init function Application.ExternalCall("onGameReady", autoScaleCanvas); } } @@ -1217,7 +1233,6 @@ private void RefreshSafeArea(JObject safeAreaObj) { float height = Screen.height * heightValue; float width = Screen.width * GetFloatFromMessage(safeAreaObj, "width", 1); - // TODO(Marc) Update when we send width / height that are no longer bottom / right Rect safeArea = new() { y = y, height = height, @@ -1247,15 +1262,18 @@ protected void Update() { _runtimeConfigurator?.RefreshConfiguration(); if (IsAndroidRuntime) { - //back button on TV remotes + // Back button on TV remotes if (Input.GetKeyDown(KeyCode.Escape)) { Application.Quit(); } } } + protected void LateUpdate() => ProcessEvents(); + + protected void FixedUpdate() => ProcessEvents(); + private void ProcessEvents() { - // dispatch event queue on main unity thread while (eventQueue.Count > 0) { eventQueue.Dequeue().Invoke(); } @@ -1288,11 +1306,9 @@ public static T ACFindObjectOfType() where T : UnityEngine.Object { return FindFirstObjectByType(); #endif } - #endregion #region internal functions - private void OnDeviceStateChange(JObject msg) { if (msg["device_id"] == null) { return; @@ -1414,7 +1430,68 @@ private void OnMessage(JObject msg) { } } + private void RequestAudioFocus() { + if (!_canHaveAudioFocus) { + AirConsoleLogger.Log(() => "AirConsole: Not requesting audio focus because the app is not allowed."); + return; + } + + if (IsAndroidRuntime) { + HasAudioFocus = _pluginManager.RequestAudioFocus(); + } else { + HasAudioFocus = true; + } + + if (!HasAudioFocus) { + AirConsoleLogger.LogError(() => + "AirConsole: Failed to obtain audio focus. Audio may not work as expected. Should pause platform"); + } + } + + private void AbandonAudioFocus() { + HasAudioFocus = false; + if (IsAndroidRuntime) { + _pluginManager.AbandonAudioFocus(); + } + } + + private bool _firstReady = true; + + // TODO(QAB-14400, QAB-14401): This does not yet work correctly - when going to web, we lose audio focus and due to that + // we do not regain it when coming back from web in OnReady. We need to distinguish between the two paths private void OnReady(JObject msg) { + _ignoreAudioFocusLoss = false; + if (_firstReady) { + _firstReady = false; + _canHaveAudioFocus = true; + } + + RequestAudioFocus(); + if (Application.platform == RuntimePlatform.Android) { + // Android based games must respect the volume change requests so we can correctly handle Android AudioFocus behavior as + // demanded by Automotive on one side and Android 33+ on the other side. + if (OnGameAudioFocusChanged == null || OnGameAudioFocusChanged.GetInvocationList().Length == 0) { +#if UNITY_EDITOR + UnityEditor.EditorApplication.isPlaying = false; + throw new Exception("No listeners registered to OnGameAudioFocusChanged. Editor playback stopped."); +#else + throw new Exception("No listeners registered to OnGameAudioFocusChanged."); +#endif + } + + if (!Application.isEditor) { + webViewObject.AbandonUnityAudioFocus(); + + // TODO(PRO-1637): Implement the necessary pieces to properly handle AudioFocus changes on Android in conjunction with + // WebView and the AirConsole Unity Plugin. + } + } else { + if (OnGameAudioFocusChanged != null && OnGameAudioFocusChanged.GetInvocationList().Length > 0) { + AirConsoleLogger.Log(() => + "Registration to event OnGameAudioFocusChanged identified. This will only be called when running on Android devices."); + } + } + // Queue all state modifications to run on the Unity main thread to avoid race conditions eventQueue.Enqueue(delegate() { if (webViewLoadingCanvas) { @@ -1456,6 +1533,8 @@ private void OnReady(JObject msg) { _devices.Add(assign); } + _receivedReady = true; + if (onReady != null) { onReady((string)msg["code"]); } @@ -1550,6 +1629,7 @@ private void ResetCaches(Action taskToQueueAfterClear) { _server_time_offset = 0; _location = null; _translations = null; + _receivedReady = false; // Reset safe area _safeAreaWasSet = false; @@ -1611,7 +1691,12 @@ private void CleanupWebSocketListener() { AirConsoleLogger.LogDevelopment(() => "WebSocket listener cleanup complete"); } - private void RecreateWebView() { + private void ReloadWebView() { + if (!_receivedReady) { + AirConsoleLogger.LogDevelopment(() => "Skipping reload. We have not yet left the Player Lobby."); + return; + } + if (string.IsNullOrEmpty(_webViewOriginalUrl) || string.IsNullOrEmpty(_webViewConnectionUrl)) { List missingComponents = new(); if (string.IsNullOrEmpty(_webViewOriginalUrl)) { @@ -1627,32 +1712,17 @@ private void RecreateWebView() { return; } - AirConsoleLogger.LogDevelopment(() => $"Recreating webview with URL: {_webViewOriginalUrl}"); - - // Cleanup websocket listener first to prevent stale events - CleanupWebSocketListener(); - - // Reset webview manager - _webViewManager = null; - - // Destroy the old webview if (webViewObject) { - if (_pluginManager != null && _reloadWebviewHandler != null) { - _pluginManager.OnReloadWebview -= _reloadWebviewHandler; - _reloadWebviewHandler = null; - } - - webViewObject.Destroy(); - - Destroy(webViewObject.gameObject); - webViewObject = null; + AirConsoleLogger.LogDevelopment(() => $"Reloading webview with URL: {_webViewOriginalUrl}"); + LoadAndroidWebviewUrl(_webViewOriginalUrl); + } else { + AirConsoleLogger.LogError(() => "Reloading webview failed, no webViewObject found."); } - - // Recreate the webview with stored connection URL - CreateAndroidWebview(_webViewConnectionUrl); } private void OnGameEnd(JObject msg) { + _ignoreAudioFocusLoss = true; + AbandonAudioFocus(); _webViewManager.RequestStateTransition(WebViewManager.WebViewState.FullScreen); try { @@ -1672,7 +1742,7 @@ private void OnGameEnd(JObject msg) { eventQueue.Enqueue(delegate { // We want to chain RecreateWebView to ensure it happens independent of // the eventQueue getting cleared and related side effects. - ResetCaches(RecreateWebView); + ResetCaches(ReloadWebView); }); } catch (Exception e) { if (Settings.debug.error) { @@ -1796,6 +1866,8 @@ private void OnPremium(JObject msg) { } private void OnPause(JObject msg) { + AbandonAudioFocus(); + try { if (onPause != null) { eventQueue.Enqueue(delegate() { @@ -1816,6 +1888,9 @@ private void OnPause(JObject msg) { } private void OnResume(JObject msg) { + // When we resume, we can have audio focus again. + _canHaveAudioFocus = true; + RequestAudioFocus(); try { if (onResume != null) { eventQueue.Enqueue(delegate() { @@ -1857,6 +1932,24 @@ public ReadOnlyCollection ActivePlayerDeviceIds { get => _players.AsReadOnly(); } + /// + /// Maximum Audio Volume allowed at this time.
+ /// A value of 0 indicates, that the game should be muted right now and all audio output should be paused.
+ /// A value of 1 indicates, that the game can play audio at full volume.
+ /// Values in between should be used to set the volume of the audio output.
+ /// This value can change at any time and you are expected to listen to OnMaximumVolumeChanged and adjust accordingly immediately. + ///
+ /// 1 + public float MaximumAudioVolume { get; private set; } = 1; + + /// + /// Does the game currently have audio focus?
+ /// If false, the game should not play any audio at all.
+ /// If true, the game can play audio, respecting the MaximumAudioVolume property.
+ /// This value can change at any time and you are expected to listen to OnGameAudioFocusChanged and adjust accordingly immediately. + ///
+ public bool HasAudioFocus { get; private set; } = true; + /// /// True, if this is the Android platform running on the device, not the editor. /// @@ -1891,6 +1984,7 @@ internal static bool IsAndroidOrEditor { private Action _reloadWebviewHandler; private PluginManager _pluginManager; + private bool _receivedReady = false; private List _devices = new(); private int _device_id; private int _server_time_offset; @@ -1923,9 +2017,7 @@ private void StopWebsocketServer() { private void OnClose() { // Queue the clear operation to run on the Unity main thread to avoid race conditions - eventQueue.Enqueue(delegate() { - _devices.Clear(); - }); + eventQueue.Enqueue(delegate() { _devices.Clear(); }); } public static string GetUrl(StartMode mode) { @@ -2007,13 +2099,9 @@ private void AllocateDeviceSlots(int i) { private int GetScaledWebViewHeight() => (int)((float)webViewHeight * Screen.height / defaultScreenHeight); - private void OnConnectUrlReceived (string connectionUrl) { + private void OnConnectUrlReceived(string connectionUrl) { _pluginManager.OnConnectionUrlReceived -= OnConnectUrlReceived; - eventQueue.Enqueue(delegate { - // connectionUrl = "client?id=bmw-idc-23&runtimePlatform=android&homeCountry=DE&SwPu=24-11"; - CreateAndroidWebview(connectionUrl); - }); - + eventQueue.Enqueue(delegate { CreateAndroidWebview(connectionUrl); }); } private string ComputeUrlVersion(string version) { @@ -2075,6 +2163,7 @@ private void PrepareWebviewOverlay() { } else { webViewLoadingImage.rectTransform.sizeDelta = new Vector2(Screen.width / 2, Screen.height / 2); } + webViewLoadingImage.preserveAspect = true; if (!webViewLoadingSprite) { webViewLoadingImage.sprite = Resources.Load("androidtv-loadingscreen", typeof(Sprite)) as Sprite; @@ -2083,7 +2172,7 @@ private void PrepareWebviewOverlay() { private void CreateAndroidWebview(string connectionUrl) { AirConsoleLogger.LogDevelopment(() => $"CreateAndroidWebview with connection url {connectionUrl}"); - if (webViewObject == null) { + if (!webViewObject) { _webViewConnectionUrl = connectionUrl; webViewObject = new GameObject("WebViewObject").AddComponent(); @@ -2091,6 +2180,8 @@ private void CreateAndroidWebview(string connectionUrl) { DontDestroyOnLoad(webViewObject.gameObject); } + webViewObject.SetOnAudioFocusChanged(HandleWebViewAudioFocusChanged); + webViewObject.Init(ProcessJS, err => AirConsoleLogger.LogDevelopment(() => $"AirConsole WebView error: {err}"), httpError => AirConsoleLogger.LogDevelopment(() => $"AirConsole WebView HttpError: {httpError}"), @@ -2100,13 +2191,18 @@ private void CreateAndroidWebview(string connectionUrl) { cookies => AirConsoleLogger.LogDevelopment(() => $"AirConsole WebView cookies: {cookies}"), true, false); + if (IsAndroidRuntime && _pluginManager != null) { + _pluginManager.OnReloadWebview += () => webViewObject.Reload(); + _pluginManager.InitializeOfflineCheck(); + } + string url; if (IsAndroidRuntime) { - string urlOverride = AndroidIntentUtils.GetIntentExtraString("base_url", string.Empty); - url = !string.IsNullOrEmpty(urlOverride) ? urlOverride : Settings.AIRCONSOLE_BASE_URL; - AirConsoleLogger.LogDevelopment(() => $"BaseURL Override: {urlOverride}"); + string urlOverride = AndroidIntentUtils.GetIntentExtraString("base_url", string.Empty); + url = !string.IsNullOrEmpty(urlOverride) ? urlOverride : Settings.AIRCONSOLE_BASE_URL; + AirConsoleLogger.LogDevelopment(() => $"BaseURL Override: {urlOverride}"); } else { - url = Settings.AIRCONSOLE_BASE_URL; + url = Settings.AIRCONSOLE_BASE_URL; } url += connectionUrl; @@ -2115,7 +2211,7 @@ private void CreateAndroidWebview(string connectionUrl) { } androidGameVersion = AndroidIntentUtils.GetIntentExtraString("game_version", androidGameVersion); - + url += "&game-id=" + Application.identifier; url += "&game-version=" + androidGameVersion; url += "&unity-version=" + Application.unityVersion; @@ -2126,23 +2222,31 @@ private void CreateAndroidWebview(string connectionUrl) { _webViewOriginalUrl = url; _webViewManager = new WebViewManager(webViewObject, defaultScreenHeight); - webViewObject.SetVisibility(!Application.isEditor); - AirConsoleLogger.LogDevelopment(() => $"Initial URL: {url}"); - webViewObject.LoadURL(url); + LoadAndroidWebviewUrl(url); - if (IsAndroidRuntime) { - if (_pluginManager != null) { - _reloadWebviewHandler = () => webViewObject.LoadURL(url); - _pluginManager.OnReloadWebview += _reloadWebviewHandler; - _pluginManager.InitializeOfflineCheck(); + _logPlatformMessages = AndroidIntentUtils.GetIntentExtraBool("log_platform_messages", false); + InitWebSockets(); + } + } + + private void LoadAndroidWebviewUrl(string url) { + webViewObject.SetVisibility(!Application.isEditor); + AirConsoleLogger.LogDevelopment(() => $"Initial URL: {url}"); + webViewObject.LoadURL(url); + + if (IsAndroidRuntime) { + if (_pluginManager != null) { + if (_reloadWebviewHandler != null) { + _pluginManager.OnReloadWebview -= _reloadWebviewHandler; } - bool isWebviewDebuggable = AndroidIntentUtils.GetIntentExtraBool("webview_debuggable", false); - webViewObject.EnableWebviewDebugging(isWebviewDebuggable); + _reloadWebviewHandler = () => webViewObject.LoadURL(url); + _pluginManager.OnReloadWebview += _reloadWebviewHandler; + _pluginManager.InitializeOfflineCheck(); } - _logPlatformMessages = AndroidIntentUtils.GetIntentExtraBool("log_platform_messages", false); - InitWebSockets(); + bool isWebviewDebuggable = AndroidIntentUtils.GetIntentExtraBool("webview_debuggable", false); + webViewObject.EnableWebviewDebugging(isWebviewDebuggable); } } @@ -2151,7 +2255,6 @@ private static bool ResolveNativeGameSizingSupport(bool fallback) { return settings ? settings.NativeGameSizingSupported : fallback; } - private static int GetAndroidBundleVersionCode() { AndroidJavaObject ca = UnityAndroidObjectProvider.GetUnityActivity(); AndroidJavaObject packageManager = ca.Call("getPackageManager"); @@ -2167,13 +2270,11 @@ private void OnLaunchApp(JObject msg) { if (gameId != Application.identifier || gameVersion != instance.androidGameVersion) { // Marshal to main thread since this is called from WebSocket background thread - eventQueue.Enqueue(() => { - StartCoroutine(HandleLaunchAppTransition(msg, gameId, gameVersion)); - }); + eventQueue.Enqueue(() => HandleLaunchAppTransition(msg, gameId, gameVersion)); } } - private System.Collections.IEnumerator HandleLaunchAppTransition(JObject msg, string gameId, string gameVersion) { + private void HandleLaunchAppTransition(JObject msg, string gameId, string gameVersion) { bool quitAfterLaunchIntent = false; // Flag used to force old pre v2.5 way of quitting if (msg["quit_after_launch_intent"] != null) { @@ -2184,8 +2285,9 @@ private System.Collections.IEnumerator HandleLaunchAppTransition(JObject msg, st if (!quitAfterLaunchIntent) { Application.Quit(); if (_pluginManager == null || !_pluginManager.IsAutomotive()) { - AirConsoleLogger.LogDevelopment(() => $"Quit and wait for 2 seconds"); - yield return new WaitForSecondsRealtime(2.0f); + int waitTime = _pluginManager != null && _pluginManager.IsAutomotive() ? 500 : 2000; + AirConsoleLogger.LogDevelopment(() => $"Quit and wait for {waitTime} milliseconds"); + Thread.Sleep(waitTime); } else { AirConsoleLogger.LogDevelopment(() => $"Quit immediately"); } @@ -2199,11 +2301,10 @@ private System.Collections.IEnumerator HandleLaunchAppTransition(JObject msg, st if (quitAfterLaunchIntent) { AirConsoleLogger.LogDevelopment(() => $"Quit after launch intent"); Application.Quit(); - yield break; + return; } - float timeout = 2.0f; - yield return new WaitForSecondsRealtime(timeout); + Thread.Sleep(_pluginManager != null && _pluginManager.IsAutomotive() ? 500 : 2000); FinishActivity(); } @@ -2256,7 +2357,7 @@ private void OnUnityWebviewResize(JObject msg) { int h = Screen.height; if (msg["top_bar_height"] != null) { - h = (int)msg["top_bar_height"] * 2; // todo(android-native): This probably should use the screen dpi scaling factor + h = (int)msg["top_bar_height"] * 2; // TODO(android-native): This should use the screen dpi scaling factor webViewHeight = h; _webViewManager.SetWebViewHeight(h); } @@ -2325,6 +2426,153 @@ private void AdaptUGuiLayout() { } } + #region Audio Focus and Volume + private bool _nativeGainedAudioFocus; + private bool _canIgnoreNativeAudioLoss = true; + + private void HandleOnMaxVolumeChanged(float newMaximumVolume) { + MaximumAudioVolume = Mathf.Clamp01(_canHaveAudioFocus ? newMaximumVolume : 0f); + AirConsoleLogger.LogDevelopment(() => + $"HandleOnMaxVolumeChanged({newMaximumVolume}) -> {MaximumAudioVolume}. No action taken."); + } + + // TODO(QAB-14400, QAB-14401, QAB-14403): There are edge cases left regarding _ignoreAudioFocusLoss which is true from onGameEnd -> onReady? + private void HandleAudioFocusChange(bool canHaveAudioFocus, bool shallMuteWebview) { + AirConsoleLogger.LogDevelopment(() => $"HandleAudioFocusChanged({canHaveAudioFocus})"); + + if (!canHaveAudioFocus && _ignoreAudioFocusLoss) { + AirConsoleLogger.LogDevelopment(() => "Ignoring audio focus loss until the game is ready."); + return; + } + + // TODO(PRO-1637): Implement a more complete state machine to handle audio focus changes correctly. + _canHaveAudioFocus = canHaveAudioFocus; + if (!canHaveAudioFocus) { + AirConsoleLogger.LogError(() => "Can have audio focus lost."); + } + + MaximumAudioVolume = canHaveAudioFocus ? 1f : 0f; + eventQueue.Enqueue(() => OnGameAudioFocusChanged?.Invoke(canHaveAudioFocus, MaximumAudioVolume)); + } + + // Webview Audio Focus change handler + private void HandleWebViewAudioFocusChanged(string command) { + HandlePlatformAudioFocusChanged(command); + } + + private void HandleNativeAudioFocusChanged(string command) { + HandlePlatformAudioFocusChanged(command); + } + + private void HandlePlatformAudioFocusChanged(string command) { + AirConsoleLogger.LogDevelopment(() => $"HandlePlatformAudioFocusChanged('{command}')"); + if (string.IsNullOrEmpty(command)) { + AirConsoleLogger.LogError(() => "Audio focus command was null or empty."); + return; + } + + if (command.StartsWith("WEBVIEW_AUDIOFOCUS_", StringComparison.Ordinal)) { + HandleWebViewAudioFocusEvent(command); + return; + } + + if (command.StartsWith("NATIVE_AUDIOFOCUS_", StringComparison.Ordinal)) { + HandleNativeAudioFocusEvent(command); + return; + } + + AirConsoleLogger.LogError(() => $"Unknown audio focus command: {command}"); + } + + private void HandleWebViewAudioFocusEvent(string command) { + switch (command) { + case "WEBVIEW_AUDIOFOCUS_START": + break; + case "WEBVIEW_AUDIOFOCUS_STOP": + break; + case "WEBVIEW_AUDIOFOCUS_GAIN": + case "WEBVIEW_AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE": + case "WEBVIEW_AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK": + case "WEBVIEW_AUDIOFOCUS_GAIN_TRANSIENT": + AirConsoleLogger.Log(() => + $"{command}: Can ignore native loss={_canIgnoreNativeAudioLoss}"); + HasAudioFocus = true; + _ignoreAudioFocusLoss = true; + break; + case "WEBVIEW_AUDIOFOCUS_LOSS": + AirConsoleLogger.Log(() => + $"{command}: Can ignore native loss={_canIgnoreNativeAudioLoss}"); + + if (_nativeGainedAudioFocus) { + return; + } + + _ignoreAudioFocusLoss = false; + HandleAudioFocusChange(false, true); + break; + + case "WEBVIEW_AUDIOFOCUS_LOSS_TRANSIENT": + case "WEBVIEW_AUDIOFOCUS_LOSS_CAN_DUCK": + break; + + // This is fired when we ask the webview to abandon audio focus. + case "WEBVIEW_AUDIOFOCUS_ABANDON": + break; + + default: + AirConsoleLogger.LogError(() => $"Unknown audio focus command from webview: {command}"); + break; + } + } + + private void HandleNativeAudioFocusEvent(string command) { + switch (command) { + case "NATIVE_AUDIOFOCUS_GAIN": + case "NATIVE_AUDIOFOCUS_GAIN_TRANSIENT": + case "NATIVE_AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE": + case "NATIVE_AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK": + AirConsoleLogger.Log(() => + $"{command}: Can ignore native loss={_canIgnoreNativeAudioLoss}"); + HasAudioFocus = true; + _ignoreAudioFocusLoss = false; + _nativeGainedAudioFocus = true; + + HandleAudioFocusChange(true, true); + + break; + + case "NATIVE_AUDIOFOCUS_LOSS": + AirConsoleLogger.Log(() => + $"{command}: Can ignore native loss={_canIgnoreNativeAudioLoss}"); + + if (_canIgnoreNativeAudioLoss) { + _canIgnoreNativeAudioLoss = false; + return; + } + + _nativeGainedAudioFocus = false; + _ignoreAudioFocusLoss = false; + HandleAudioFocusChange(false, true); + + break; + case "NATIVE_AUDIOFOCUS_LOSS_TRANSIENT": + case "NATIVE_AUDIOFOCUS_LOSS_CAN_DUCK": + break; + case "NATIVE_AUDIOFOCUS_ABANDON": + _nativeGainedAudioFocus = false; + _ignoreAudioFocusLoss = false; + HandleAudioFocusChange(true, false); + break; + + case "NATIVE_AUDIOFOCUS_NONE": + break; + default: + AirConsoleLogger.LogError(() => $"Unknown audio focus command from native plugin: {command}"); + break; + } + } + #endregion Audio Focus and Volume + /// /// Called when there is an update for the content provider. /// @@ -2356,17 +2604,9 @@ private static float GetFloatFromMessage(JObject msg, string name, int defaultVa !string.IsNullOrEmpty((string)msg[name]) ? (float)msg[name] : defaultValue; - #endregion #region AirConsole Internal - - internal event Action OnApplicationFocusChanged; - - private void OnApplicationFocus(bool hasFocus) { - OnApplicationFocusChanged?.Invoke(hasFocus); - } - /// /// Sends a message to the platform. /// @@ -2378,7 +2618,6 @@ internal void SendPlatformMessage(JObject msg) { wsListener.Message(msg); } - #endregion AirConsole Internal #endif diff --git a/Assets/AirConsole/scripts/Tests/EditMode/AirConsoleTests.cs b/Assets/AirConsole/scripts/Tests/EditMode/AirConsoleTests.cs index 8de884aa..f1b39618 100644 --- a/Assets/AirConsole/scripts/Tests/EditMode/AirConsoleTests.cs +++ b/Assets/AirConsole/scripts/Tests/EditMode/AirConsoleTests.cs @@ -102,6 +102,10 @@ private void Start() { frameCount++; base.Update(); } + + internal new void FixedUpdate() => base.FixedUpdate(); + internal new void LateUpdate() => base.LateUpdate(); + internal new void SetSafeArea(JObject message) { base.SetSafeArea(message); From 5ecbafdae7042cc5193a1bdc01c7b7e63b80dbfb Mon Sep 17 00:00:00 2001 From: marc-n-dream Date: Thu, 11 Dec 2025 10:59:19 +0100 Subject: [PATCH 10/11] R: Integrate unity-webview v1.1.6 and simplify packager --- .../Editor/UnityWebViewPostprocessBuild.cs | 131 +-- .../WebViewPlugin-development.aar.tmpl | Bin 39468 -> 45884 bytes .../WebViewPlugin-development.aar.tmpl.meta | 2 +- .../Android/WebViewPlugin-release.aar.tmpl | Bin 39681 -> 45884 bytes .../WebViewPlugin-release.aar.tmpl.meta | 2 +- .../unity-webview/Plugins/Editor.meta | 8 - .../Editor/UnityWebViewPostprocessBuild.cs | 539 ------------- .../unity-webview/Plugins/WebView.bundle.meta | 57 +- .../WebView.bundle/Contents/Info.plist | 2 +- .../WebView.bundle/Contents/MacOS/WebView | Bin 270288 -> 270288 bytes .../unity-webview/Runtime/WebViewCallback.cs | 110 +++ .../Runtime/WebViewCallback.cs.meta | 11 + .../unity-webview/Runtime/WebViewEvent.cs | 244 ++++++ .../WebViewEvent.cs.meta} | 2 +- .../unity-webview/Runtime/WebViewObject.cs | 760 ++++++++++-------- Assets/Packager/Editor/Packager.cs | 28 +- 16 files changed, 893 insertions(+), 1003 deletions(-) delete mode 100644 Assets/AirConsole/unity-webview/Plugins/Editor.meta delete mode 100644 Assets/AirConsole/unity-webview/Plugins/Editor/UnityWebViewPostprocessBuild.cs create mode 100644 Assets/AirConsole/unity-webview/Runtime/WebViewCallback.cs create mode 100644 Assets/AirConsole/unity-webview/Runtime/WebViewCallback.cs.meta create mode 100644 Assets/AirConsole/unity-webview/Runtime/WebViewEvent.cs rename Assets/AirConsole/unity-webview/{Plugins/Editor/UnityWebViewPostprocessBuild.cs.meta => Runtime/WebViewEvent.cs.meta} (83%) diff --git a/Assets/AirConsole/unity-webview/Editor/UnityWebViewPostprocessBuild.cs b/Assets/AirConsole/unity-webview/Editor/UnityWebViewPostprocessBuild.cs index cb840e4d..4586f87d 100644 --- a/Assets/AirConsole/unity-webview/Editor/UnityWebViewPostprocessBuild.cs +++ b/Assets/AirConsole/unity-webview/Editor/UnityWebViewPostprocessBuild.cs @@ -23,6 +23,8 @@ public class UnityWebViewPostprocessBuild { private static bool nofragment = true; + + //// for android/unity 2018.1 or newer //// cf. https://forum.unity.com/threads/android-hardwareaccelerated-is-forced-false-in-all-activities.532786/ //// cf. https://github.com/Over17/UnityAndroidManifestCallback @@ -47,53 +49,9 @@ public void OnPreprocessBuild(BuildTarget buildTarget, string path) { public void OnPostGenerateGradleAndroidProject(string basePath) { var changed = false; var androidManifest = new AndroidManifest(GetManifestPath(basePath)); - if (!nofragment) { - changed = (androidManifest.AddFileProvider(basePath) || changed); - { - var path = GetBuildGradlePath(basePath); - var lines0 = File.ReadAllText(path).Replace("\r\n", "\n").Replace("\r", "\n").Split(new[]{'\n'}); - { - var lines = new List(); - var independencies = false; - foreach (var line in lines0) { - if (line == "dependencies {") { - independencies = true; - } else if (independencies && line == "}") { - independencies = false; - lines.Add(" implementation 'androidx.core:core:1.6.0'"); - } else if (independencies) { - if (line.Contains("implementation(name: 'core") - || line.Contains("implementation(name: 'androidx.core.core") - || line.Contains("implementation 'androidx.core:core")) { - break; - } - } - lines.Add(line); - } - if (lines.Count > lines0.Length) { - File.WriteAllText(path, string.Join("\n", lines) + "\n"); - } - } - } - { - var path = GetGradlePropertiesPath(basePath); - var lines0 = ""; - var lines = ""; - if (File.Exists(path)) { - lines0 = File.ReadAllText(path).Replace("\r\n", "\n").Replace("\r", "\n") + "\n"; - lines = lines0; - } - if (!lines.Contains("android.useAndroidX=true")) { - lines += "android.useAndroidX=true\n"; - } - if (!lines.Contains("android.enableJetifier=true")) { - lines += "android.enableJetifier=true\n"; - } - if (lines != lines0) { - File.WriteAllText(path, lines); - } - } - } + + AddAndroidXDependencies(ref changed, androidManifest, basePath, !nofragment); + changed = (androidManifest.SetExported(true) || changed); changed = (androidManifest.SetWindowSoftInputMode("adjustPan") || changed); changed = (androidManifest.SetHardwareAccelerated(true) || changed); @@ -112,6 +70,63 @@ public void OnPostGenerateGradleAndroidProject(string basePath) { Debug.Log("unitywebview: adjusted AndroidManifest.xml."); } } + + private void AddAndroidXDependencies(ref bool changed, AndroidManifest androidManifest, string basePath, bool includeCoreDependency) { + changed = androidManifest.AddFileProvider(basePath) || changed; + { + string path = GetBuildGradlePath(basePath); + string[] lines0 = File.ReadAllText(path).Replace("\r\n", "\n").Replace("\r", "\n").Split(new[] { '\n' }); + { + List lines = new(); + bool inDependencies = false; + bool hasCore = false; + foreach (string line in lines0) { + if (line == "dependencies {") { + inDependencies = true; + } else if (inDependencies && line == "}") { + if (includeCoreDependency && !hasCore) { + lines.Add(" implementation 'androidx.core:core:1.6.0'"); + hasCore = true; + } + inDependencies = false; + } else if (inDependencies) { + if (line.Contains("implementation(name: 'core") + || line.Contains("implementation(name: 'androidx.core.core") + || line.Contains("implementation 'androidx.core:core")) { + hasCore = true; + } + } + + lines.Add(line); + } + + if (lines.Count > lines0.Length) { + File.WriteAllText(path, string.Join("\n", lines) + "\n"); + } + } + } + { + string path = GetGradlePropertiesPath(basePath); + string lines0 = ""; + string lines = ""; + if (File.Exists(path)) { + lines0 = File.ReadAllText(path).Replace("\r\n", "\n").Replace("\r", "\n") + "\n"; + lines = lines0; + } + + if (!lines.Contains("android.useAndroidX=true")) { + lines += "android.useAndroidX=true\n"; + } + + if (!lines.Contains("android.enableJetifier=true")) { + lines += "android.enableJetifier=true\n"; + } + + if (lines != lines0) { + File.WriteAllText(path, lines); + } + } + } #endif public int callbackOrder { @@ -186,25 +201,8 @@ public static void OnPostprocessBuild(BuildTarget buildTarget, string path) { var androidManifest = new AndroidManifest(manifest); if (!nofragment) { changed = (androidManifest.AddFileProvider("Assets/Plugins/Android") || changed); - var files = Directory.GetFiles("Assets/Plugins/Android/"); - var found = false; - foreach (var file in files) { - if (Regex.IsMatch(file, @"^Assets/Plugins/Android/(androidx\.core\.)?core-.*.aar$")) { - found = true; - break; - } - } - if (!found) { - foreach (var file in files) { - var match = Regex.Match(file, @"^Assets/Plugins/Android/(core.*.aar).tmpl$"); - if (match.Success) { - var name = match.Groups[1].Value; - File.Copy(file, "Assets/Plugins/Android/" + name, true); - break; - } - } - } } + changed = (androidManifest.SetWindowSoftInputMode("adjustPan") || changed); changed = (androidManifest.SetHardwareAccelerated(true) || changed); #if UNITYWEBVIEW_ANDROID_USES_CLEARTEXT_TRAFFIC @@ -283,6 +281,7 @@ public static void OnPostprocessBuild(BuildTarget buildTarget, string path) { File.WriteAllText(projPath, dst); } } + } internal class AndroidXmlDocument : XmlDocument { @@ -391,6 +390,7 @@ internal bool AddFileProvider(string basePath) { bool changed = false; var authorities = PlayerSettings.applicationIdentifier + ".unitywebview.fileprovider"; if (SelectNodes("/manifest/application/provider[@android:authorities='" + authorities + "']", nsMgr).Count == 0) { + // Add the file provider for the Fragment-based webview implementation. var elem = CreateElement("provider"); elem.Attributes.Append(CreateAndroidAttribute("name", "androidx.core.content.FileProvider")); elem.Attributes.Append(CreateAndroidAttribute("authorities", authorities)); @@ -401,6 +401,7 @@ internal bool AddFileProvider(string basePath) { meta.Attributes.Append(CreateAndroidAttribute("resource", "@xml/unitywebview_file_provider_paths")); elem.AppendChild(meta); ApplicationElement.AppendChild(elem); + changed = true; var xml = GetFileProviderSettingPath(basePath); if (!File.Exists(xml)) { diff --git a/Assets/AirConsole/unity-webview/Plugins/Android/WebViewPlugin-development.aar.tmpl b/Assets/AirConsole/unity-webview/Plugins/Android/WebViewPlugin-development.aar.tmpl index 23bdad7db48c711e81286b9e4c18998173e7e2d2..14649de838d1c99949d2d815c1c58c122aded347 100644 GIT binary patch literal 45884 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 WUJCrzf1tpBZrPviSor}10{TB7qD~(G literal 39468 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 i|BUg!u_eJO8UK%nt1F?R{X>QN+*O}F7@6aWAS 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 WUJCrzf1tpBZrPviSor}10{TB7qD~(G literal 39681 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

Td7*q9v9)2``5LvbopE-O-UWpvtjPMfC{C?A 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�oWTE1L}i38?AUVHTdTw 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 diff --git a/Assets/AirConsole/unity-webview/Plugins/Android/WebViewPlugin-release.aar.tmpl.meta b/Assets/AirConsole/unity-webview/Plugins/Android/WebViewPlugin-release.aar.tmpl.meta index d4aa3543..f0cbe4e4 100644 --- a/Assets/AirConsole/unity-webview/Plugins/Android/WebViewPlugin-release.aar.tmpl.meta +++ b/Assets/AirConsole/unity-webview/Plugins/Android/WebViewPlugin-release.aar.tmpl.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 69e600137811c42778f78793d1022369 +guid: 36390d8e865ea43038c562226860c091 DefaultImporter: externalObjects: {} userData: diff --git a/Assets/AirConsole/unity-webview/Plugins/Editor.meta b/Assets/AirConsole/unity-webview/Plugins/Editor.meta deleted file mode 100644 index 4afc4293..00000000 --- a/Assets/AirConsole/unity-webview/Plugins/Editor.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 5415c2bc4488c42739b36767bc7f8c83 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/AirConsole/unity-webview/Plugins/Editor/UnityWebViewPostprocessBuild.cs b/Assets/AirConsole/unity-webview/Plugins/Editor/UnityWebViewPostprocessBuild.cs deleted file mode 100644 index cb840e4d..00000000 --- a/Assets/AirConsole/unity-webview/Plugins/Editor/UnityWebViewPostprocessBuild.cs +++ /dev/null @@ -1,539 +0,0 @@ -#if UNITY_EDITOR -using System.Collections.Generic; -using System.Collections; -using System.IO; -using System.Reflection; -using System.Text.RegularExpressions; -using System.Text; -using System.Xml; -using System; -using UnityEditor.Android; -#if UNITY_2018_1_OR_NEWER -using UnityEditor.Build; -#endif -using UnityEditor.Callbacks; -using UnityEditor; -using UnityEngine; - -#if UNITY_2018_1_OR_NEWER -public class UnityWebViewPostprocessBuild : IPreprocessBuild, IPostGenerateGradleAndroidProject -#else -public class UnityWebViewPostprocessBuild -#endif -{ - private static bool nofragment = true; - - //// for android/unity 2018.1 or newer - //// cf. https://forum.unity.com/threads/android-hardwareaccelerated-is-forced-false-in-all-activities.532786/ - //// cf. https://github.com/Over17/UnityAndroidManifestCallback - -#if UNITY_2018_1_OR_NEWER - public void OnPreprocessBuild(BuildTarget buildTarget, string path) { - if (buildTarget == BuildTarget.Android) { - var dev = "Packages/com.airconsole.unity-webview/Assets/Plugins/Android/WebViewPlugin-development.aar.tmpl"; - var rel = "Packages/com.airconsole.unity-webview/Assets/Plugins/Android/WebViewPlugin-release.aar.tmpl"; - if (!File.Exists(dev) || !File.Exists(rel)) { - dev = "Assets/AirConsole/unity-webview/Plugins/Android/WebViewPlugin-development.aar.tmpl"; - rel = "Assets/AirConsole/unity-webview/Plugins/Android/WebViewPlugin-release.aar.tmpl"; - } - var src = (EditorUserBuildSettings.development) ? dev : rel; - //Directory.CreateDirectory("Temp/StagingArea/aar"); - //File.Copy(src, "Temp/StagingArea/aar/WebViewPlugin.aar", true); - Directory.CreateDirectory("Assets/Plugins/Android"); - File.Copy(src, "Assets/Plugins/Android/WebViewPlugin.aar", true); - } - } - - public void OnPostGenerateGradleAndroidProject(string basePath) { - var changed = false; - var androidManifest = new AndroidManifest(GetManifestPath(basePath)); - if (!nofragment) { - changed = (androidManifest.AddFileProvider(basePath) || changed); - { - var path = GetBuildGradlePath(basePath); - var lines0 = File.ReadAllText(path).Replace("\r\n", "\n").Replace("\r", "\n").Split(new[]{'\n'}); - { - var lines = new List(); - var independencies = false; - foreach (var line in lines0) { - if (line == "dependencies {") { - independencies = true; - } else if (independencies && line == "}") { - independencies = false; - lines.Add(" implementation 'androidx.core:core:1.6.0'"); - } else if (independencies) { - if (line.Contains("implementation(name: 'core") - || line.Contains("implementation(name: 'androidx.core.core") - || line.Contains("implementation 'androidx.core:core")) { - break; - } - } - lines.Add(line); - } - if (lines.Count > lines0.Length) { - File.WriteAllText(path, string.Join("\n", lines) + "\n"); - } - } - } - { - var path = GetGradlePropertiesPath(basePath); - var lines0 = ""; - var lines = ""; - if (File.Exists(path)) { - lines0 = File.ReadAllText(path).Replace("\r\n", "\n").Replace("\r", "\n") + "\n"; - lines = lines0; - } - if (!lines.Contains("android.useAndroidX=true")) { - lines += "android.useAndroidX=true\n"; - } - if (!lines.Contains("android.enableJetifier=true")) { - lines += "android.enableJetifier=true\n"; - } - if (lines != lines0) { - File.WriteAllText(path, lines); - } - } - } - changed = (androidManifest.SetExported(true) || changed); - changed = (androidManifest.SetWindowSoftInputMode("adjustPan") || changed); - changed = (androidManifest.SetHardwareAccelerated(true) || changed); -#if UNITYWEBVIEW_ANDROID_USES_CLEARTEXT_TRAFFIC - changed = (androidManifest.SetUsesCleartextTraffic(true) || changed); -#endif -#if UNITYWEBVIEW_ANDROID_ENABLE_CAMERA - changed = (androidManifest.AddCamera() || changed); - changed = (androidManifest.AddGallery() || changed); -#endif -#if UNITYWEBVIEW_ANDROID_ENABLE_MICROPHONE - changed = (androidManifest.AddMicrophone() || changed); -#endif - if (changed) { - androidManifest.Save(); - Debug.Log("unitywebview: adjusted AndroidManifest.xml."); - } - } -#endif - - public int callbackOrder { - get { - return 1; - } - } - - private string GetManifestPath(string basePath) { - var pathBuilder = new StringBuilder(basePath); - pathBuilder.Append(Path.DirectorySeparatorChar).Append("src"); - pathBuilder.Append(Path.DirectorySeparatorChar).Append("main"); - pathBuilder.Append(Path.DirectorySeparatorChar).Append("AndroidManifest.xml"); - return pathBuilder.ToString(); - } - - private string GetBuildGradlePath(string basePath) { - var pathBuilder = new StringBuilder(basePath); - pathBuilder.Append(Path.DirectorySeparatorChar).Append("build.gradle"); - return pathBuilder.ToString(); - } - - private string GetGradlePropertiesPath(string basePath) { - var pathBuilder = new StringBuilder(basePath); - if (basePath.EndsWith("unityLibrary")) { - pathBuilder.Append(Path.DirectorySeparatorChar).Append(".."); - } - pathBuilder.Append(Path.DirectorySeparatorChar).Append("gradle.properties"); - return pathBuilder.ToString(); - } - - //// for others - - [PostProcessBuild(100)] - public static void OnPostprocessBuild(BuildTarget buildTarget, string path) { -#if UNITY_2018_1_OR_NEWER - try { - File.Delete("Assets/Plugins/Android/WebViewPlugin.aar"); - File.Delete("Assets/Plugins/Android/WebViewPlugin.aar.meta"); - Directory.Delete("Assets/Plugins/Android"); - File.Delete("Assets/Plugins/Android.meta"); - Directory.Delete("Assets/Plugins"); - File.Delete("Assets/Plugins.meta"); - } catch (Exception) { - } -#else - if (buildTarget == BuildTarget.Android) { - string manifest = Path.Combine(Application.dataPath, "Plugins/Android/AndroidManifest.xml"); - if (!File.Exists(manifest)) { - string manifest0 = Path.Combine(Application.dataPath, "../Temp/StagingArea/AndroidManifest-main.xml"); - if (!File.Exists(manifest0)) { - Debug.LogError("unitywebview: cannot find both Assets/Plugins/Android/AndroidManifest.xml and Temp/StagingArea/AndroidManifest-main.xml. please build the app to generate Assets/Plugins/Android/AndroidManifest.xml and then rebuild it again."); - return; - } else { - File.Copy(manifest0, manifest, true); - } - } - var changed = false; - if (EditorUserBuildSettings.development) { - if (!File.Exists("Assets/Plugins/Android/WebView.aar") - || !File.ReadAllBytes("Assets/Plugins/Android/WebView.aar").SequenceEqual(File.ReadAllBytes("Assets/Plugins/Android/WebViewPlugin-development.aar.tmpl"))) { - File.Copy("Assets/Plugins/Android/WebViewPlugin-development.aar.tmpl", "Assets/Plugins/Android/WebView.aar", true); - changed = true; - } - } else { - if (!File.Exists("Assets/Plugins/Android/WebView.aar") - || !File.ReadAllBytes("Assets/Plugins/Android/WebView.aar").SequenceEqual(File.ReadAllBytes("Assets/Plugins/Android/WebViewPlugin-release.aar.tmpl"))) { - File.Copy("Assets/Plugins/Android/WebViewPlugin-release.aar.tmpl", "Assets/Plugins/Android/WebView.aar", true); - changed = true; - } - } - var androidManifest = new AndroidManifest(manifest); - if (!nofragment) { - changed = (androidManifest.AddFileProvider("Assets/Plugins/Android") || changed); - var files = Directory.GetFiles("Assets/Plugins/Android/"); - var found = false; - foreach (var file in files) { - if (Regex.IsMatch(file, @"^Assets/Plugins/Android/(androidx\.core\.)?core-.*.aar$")) { - found = true; - break; - } - } - if (!found) { - foreach (var file in files) { - var match = Regex.Match(file, @"^Assets/Plugins/Android/(core.*.aar).tmpl$"); - if (match.Success) { - var name = match.Groups[1].Value; - File.Copy(file, "Assets/Plugins/Android/" + name, true); - break; - } - } - } - } - changed = (androidManifest.SetWindowSoftInputMode("adjustPan") || changed); - changed = (androidManifest.SetHardwareAccelerated(true) || changed); -#if UNITYWEBVIEW_ANDROID_USES_CLEARTEXT_TRAFFIC - changed = (androidManifest.SetUsesCleartextTraffic(true) || changed); -#endif -#if UNITYWEBVIEW_ANDROID_ENABLE_CAMERA - changed = (androidManifest.AddCamera() || changed); - changed = (androidManifest.AddGallery() || changed); -#endif -#if UNITYWEBVIEW_ANDROID_ENABLE_MICROPHONE - changed = (androidManifest.AddMicrophone() || changed); -#endif -#if UNITY_5_6_0 || UNITY_5_6_1 - changed = (androidManifest.SetActivityName("net.gree.unitywebview.CUnityPlayerActivity") || changed); -#endif - if (changed) { - androidManifest.Save(); - Debug.LogError("unitywebview: adjusted AndroidManifest.xml and/or WebView.aar. Please rebuild the app."); - } - } -#endif - if (buildTarget == BuildTarget.iOS) { - string projPath = path + "/Unity-iPhone.xcodeproj/project.pbxproj"; - var type = Type.GetType("UnityEditor.iOS.Xcode.PBXProject, UnityEditor.iOS.Extensions.Xcode"); - if (type == null) - { - Debug.LogError("unitywebview: failed to get PBXProject. please install iOS build support."); - return; - } - var src = File.ReadAllText(projPath); - //dynamic proj = type.GetConstructor(Type.EmptyTypes).Invoke(null); - var proj = type.GetConstructor(Type.EmptyTypes).Invoke(null); - //proj.ReadFromString(src); - { - var method = type.GetMethod("ReadFromString"); - method.Invoke(proj, new object[]{src}); - } - var target = ""; -#if UNITY_2019_3_OR_NEWER - //target = proj.GetUnityFrameworkTargetGuid(); - { - var method = type.GetMethod("GetUnityFrameworkTargetGuid"); - target = (string)method.Invoke(proj, null); - } -#else - //target = proj.TargetGuidByName("Unity-iPhone"); - { - var method = type.GetMethod("TargetGuidByName"); - target = (string)method.Invoke(proj, new object[]{"Unity-iPhone"}); - } -#endif - //proj.AddFrameworkToProject(target, "WebKit.framework", false); - { - var method = type.GetMethod("AddFrameworkToProject"); - method.Invoke(proj, new object[]{target, "WebKit.framework", false}); - } - var cflags = ""; - if (EditorUserBuildSettings.development) { - cflags += " -DUNITYWEBVIEW_DEVELOPMENT"; - } -#if UNITYWEBVIEW_IOS_ALLOW_FILE_URLS - cflags += " -DUNITYWEBVIEW_IOS_ALLOW_FILE_URLS"; -#endif - cflags = cflags.Trim(); - if (!string.IsNullOrEmpty(cflags)) { - // proj.AddBuildProperty(target, "OTHER_LDFLAGS", cflags); - var method = type.GetMethod("AddBuildProperty", new Type[]{typeof(string), typeof(string), typeof(string)}); - method.Invoke(proj, new object[]{target, "OTHER_CFLAGS", cflags}); - } - var dst = ""; - //dst = proj.WriteToString(); - { - var method = type.GetMethod("WriteToString"); - dst = (string)method.Invoke(proj, null); - } - File.WriteAllText(projPath, dst); - } - } -} - -internal class AndroidXmlDocument : XmlDocument { - private string m_Path; - protected XmlNamespaceManager nsMgr; - public readonly string AndroidXmlNamespace = "http://schemas.android.com/apk/res/android"; - - public AndroidXmlDocument(string path) { - m_Path = path; - using (var reader = new XmlTextReader(m_Path)) { - reader.Read(); - Load(reader); - } - nsMgr = new XmlNamespaceManager(NameTable); - nsMgr.AddNamespace("android", AndroidXmlNamespace); - } - - public string Save() { - return SaveAs(m_Path); - } - - public string SaveAs(string path) { - using (var writer = new XmlTextWriter(path, new UTF8Encoding(false))) { - writer.Formatting = Formatting.Indented; - Save(writer); - } - return path; - } -} - -internal class AndroidManifest : AndroidXmlDocument { - private readonly XmlElement ManifestElement; - private readonly XmlElement ApplicationElement; - - public AndroidManifest(string path) : base(path) { - ManifestElement = SelectSingleNode("/manifest") as XmlElement; - ApplicationElement = SelectSingleNode("/manifest/application") as XmlElement; - } - - private XmlAttribute CreateAndroidAttribute(string key, string value) { - XmlAttribute attr = CreateAttribute("android", key, AndroidXmlNamespace); - attr.Value = value; - return attr; - } - - internal XmlNode GetActivityWithLaunchIntent() { - return - SelectSingleNode( - "/manifest/application/activity[intent-filter/action/@android:name='android.intent.action.MAIN' and " - + "intent-filter/category/@android:name='android.intent.category.LAUNCHER']", - nsMgr); - } - - internal bool SetUsesCleartextTraffic(bool enabled) { - // android:usesCleartextTraffic - bool changed = false; - if (ApplicationElement.GetAttribute("usesCleartextTraffic", AndroidXmlNamespace) != ((enabled) ? "true" : "false")) { - ApplicationElement.SetAttribute("usesCleartextTraffic", AndroidXmlNamespace, (enabled) ? "true" : "false"); - changed = true; - } - return changed; - } - - // for api level 33 - internal bool SetExported(bool enabled) { - bool changed = false; - var activity = GetActivityWithLaunchIntent() as XmlElement; - if (activity.GetAttribute("exported", AndroidXmlNamespace) != ((enabled) ? "true" : "false")) { - activity.SetAttribute("exported", AndroidXmlNamespace, (enabled) ? "true" : "false"); - changed = true; - } - return changed; - } - - internal bool SetWindowSoftInputMode(string mode) { - bool changed = false; - var activity = GetActivityWithLaunchIntent() as XmlElement; - if (activity.GetAttribute("windowSoftInputMode", AndroidXmlNamespace) != mode) { - activity.SetAttribute("windowSoftInputMode", AndroidXmlNamespace, mode); - changed = true; - } - return changed; - } - - internal bool SetHardwareAccelerated(bool enabled) { - bool changed = false; - var activity = GetActivityWithLaunchIntent() as XmlElement; - if (activity.GetAttribute("hardwareAccelerated", AndroidXmlNamespace) != ((enabled) ? "true" : "false")) { - activity.SetAttribute("hardwareAccelerated", AndroidXmlNamespace, (enabled) ? "true" : "false"); - changed = true; - } - return changed; - } - - internal bool SetActivityName(string name) { - bool changed = false; - var activity = GetActivityWithLaunchIntent() as XmlElement; - if (activity.GetAttribute("name", AndroidXmlNamespace) != name) { - activity.SetAttribute("name", AndroidXmlNamespace, name); - changed = true; - } - return changed; - } - - internal bool AddFileProvider(string basePath) { - bool changed = false; - var authorities = PlayerSettings.applicationIdentifier + ".unitywebview.fileprovider"; - if (SelectNodes("/manifest/application/provider[@android:authorities='" + authorities + "']", nsMgr).Count == 0) { - var elem = CreateElement("provider"); - elem.Attributes.Append(CreateAndroidAttribute("name", "androidx.core.content.FileProvider")); - elem.Attributes.Append(CreateAndroidAttribute("authorities", authorities)); - elem.Attributes.Append(CreateAndroidAttribute("exported", "false")); - elem.Attributes.Append(CreateAndroidAttribute("grantUriPermissions", "true")); - var meta = CreateElement("meta-data"); - meta.Attributes.Append(CreateAndroidAttribute("name", "android.support.FILE_PROVIDER_PATHS")); - meta.Attributes.Append(CreateAndroidAttribute("resource", "@xml/unitywebview_file_provider_paths")); - elem.AppendChild(meta); - ApplicationElement.AppendChild(elem); - changed = true; - var xml = GetFileProviderSettingPath(basePath); - if (!File.Exists(xml)) { - Directory.CreateDirectory(Path.GetDirectoryName(xml)); - File.WriteAllText( - xml, - "\n" + - " \n" + - "\n"); - } - } - return changed; - } - - private string GetFileProviderSettingPath(string basePath) { - var pathBuilder = new StringBuilder(basePath); - pathBuilder.Append(Path.DirectorySeparatorChar).Append("src"); - pathBuilder.Append(Path.DirectorySeparatorChar).Append("main"); - pathBuilder.Append(Path.DirectorySeparatorChar).Append("res"); - pathBuilder.Append(Path.DirectorySeparatorChar).Append("xml"); - pathBuilder.Append(Path.DirectorySeparatorChar).Append("unitywebview_file_provider_paths.xml"); - return pathBuilder.ToString(); - } - - internal bool AddCamera() { - bool changed = false; - if (SelectNodes("/manifest/uses-permission[@android:name='android.permission.CAMERA']", nsMgr).Count == 0) { - var elem = CreateElement("uses-permission"); - elem.Attributes.Append(CreateAndroidAttribute("name", "android.permission.CAMERA")); - ManifestElement.AppendChild(elem); - changed = true; - } - if (SelectNodes("/manifest/uses-feature[@android:name='android.hardware.camera']", nsMgr).Count == 0) { - var elem = CreateElement("uses-feature"); - elem.Attributes.Append(CreateAndroidAttribute("name", "android.hardware.camera")); - ManifestElement.AppendChild(elem); - changed = true; - } - // cf. https://developer.android.com/training/data-storage/shared/media#media-location-permission - if (SelectNodes("/manifest/uses-permission[@android:name='android.permission.ACCESS_MEDIA_LOCATION']", nsMgr).Count == 0) { - var elem = CreateElement("uses-permission"); - elem.Attributes.Append(CreateAndroidAttribute("name", "android.permission.ACCESS_MEDIA_LOCATION")); - ManifestElement.AppendChild(elem); - changed = true; - } - // cf. https://developer.android.com/training/package-visibility/declaring - if (SelectNodes("/manifest/queries", nsMgr).Count == 0) { - var elem = CreateElement("queries"); - ManifestElement.AppendChild(elem); - changed = true; - } - if (SelectNodes("/manifest/queries/intent/action[@android:name='android.media.action.IMAGE_CAPTURE']", nsMgr).Count == 0) { - var action = CreateElement("action"); - action.Attributes.Append(CreateAndroidAttribute("name", "android.media.action.IMAGE_CAPTURE")); - var intent = CreateElement("intent"); - intent.AppendChild(action); - var queries = SelectSingleNode("/manifest/queries") as XmlElement; - queries.AppendChild(intent); - changed = true; - } - return changed; - } - - internal bool AddGallery() { - bool changed = false; - // for api level 33 - if (SelectNodes("/manifest/uses-permission[@android:name='android.permission.READ_MEDIA_IMAGES']", nsMgr).Count == 0) { - var elem = CreateElement("uses-permission"); - elem.Attributes.Append(CreateAndroidAttribute("name", "android.permission.READ_MEDIA_IMAGES")); - ManifestElement.AppendChild(elem); - changed = true; - } - if (SelectNodes("/manifest/uses-permission[@android:name='android.permission.READ_MEDIA_VIDEO']", nsMgr).Count == 0) { - var elem = CreateElement("uses-permission"); - elem.Attributes.Append(CreateAndroidAttribute("name", "android.permission.READ_MEDIA_VIDEO")); - ManifestElement.AppendChild(elem); - changed = true; - } - if (SelectNodes("/manifest/uses-permission[@android:name='android.permission.READ_MEDIA_AUDIO']", nsMgr).Count == 0) { - var elem = CreateElement("uses-permission"); - elem.Attributes.Append(CreateAndroidAttribute("name", "android.permission.READ_MEDIA_AUDIO")); - ManifestElement.AppendChild(elem); - changed = true; - } - // cf. https://developer.android.com/training/package-visibility/declaring - if (SelectNodes("/manifest/queries", nsMgr).Count == 0) { - var elem = CreateElement("queries"); - ManifestElement.AppendChild(elem); - changed = true; - } - if (SelectNodes("/manifest/queries/intent/action[@android:name='android.media.action.GET_CONTENT']", nsMgr).Count == 0) { - var action = CreateElement("action"); - action.Attributes.Append(CreateAndroidAttribute("name", "android.media.action.GET_CONTENT")); - var intent = CreateElement("intent"); - intent.AppendChild(action); - var queries = SelectSingleNode("/manifest/queries") as XmlElement; - queries.AppendChild(intent); - changed = true; - } - return changed; - } - - internal bool AddMicrophone() { - bool changed = false; - if (SelectNodes("/manifest/uses-permission[@android:name='android.permission.MICROPHONE']", nsMgr).Count == 0) { - var elem = CreateElement("uses-permission"); - elem.Attributes.Append(CreateAndroidAttribute("name", "android.permission.MICROPHONE")); - ManifestElement.AppendChild(elem); - changed = true; - } - if (SelectNodes("/manifest/uses-feature[@android:name='android.hardware.microphone']", nsMgr).Count == 0) { - var elem = CreateElement("uses-feature"); - elem.Attributes.Append(CreateAndroidAttribute("name", "android.hardware.microphone")); - ManifestElement.AppendChild(elem); - changed = true; - } - // cf. https://github.com/gree/unity-webview/issues/679 - // cf. https://github.com/fluttercommunity/flutter_webview_plugin/issues/138#issuecomment-559307558 - // cf. https://stackoverflow.com/questions/38917751/webview-webrtc-not-working/68024032#68024032 - // cf. https://stackoverflow.com/questions/40236925/allowing-microphone-accesspermission-in-webview-android-studio-java/47410311#47410311 - if (SelectNodes("/manifest/uses-permission[@android:name='android.permission.MODIFY_AUDIO_SETTINGS']", nsMgr).Count == 0) { - var elem = CreateElement("uses-permission"); - elem.Attributes.Append(CreateAndroidAttribute("name", "android.permission.MODIFY_AUDIO_SETTINGS")); - ManifestElement.AppendChild(elem); - changed = true; - } - if (SelectNodes("/manifest/uses-permission[@android:name='android.permission.RECORD_AUDIO']", nsMgr).Count == 0) { - var elem = CreateElement("uses-permission"); - elem.Attributes.Append(CreateAndroidAttribute("name", "android.permission.RECORD_AUDIO")); - ManifestElement.AppendChild(elem); - changed = true; - } - return changed; - } -} -#endif diff --git a/Assets/AirConsole/unity-webview/Plugins/WebView.bundle.meta b/Assets/AirConsole/unity-webview/Plugins/WebView.bundle.meta index 09bec84a..42a688b6 100644 --- a/Assets/AirConsole/unity-webview/Plugins/WebView.bundle.meta +++ b/Assets/AirConsole/unity-webview/Plugins/WebView.bundle.meta @@ -1,33 +1,58 @@ fileFormatVersion: 2 -guid: 5e6d20ceb4c28439b803c8423db284d5 +guid: 60e7bf38137eb4950b2f02b7d57c1ad3 +folderAsset: yes PluginImporter: - externalObjects: {} - serializedVersion: 2 + serializedVersion: 1 iconMap: {} executionOrder: {} - defineConstraints: [] isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 platformData: - - first: - Any: - second: + Android: + enabled: 0 + settings: + CPU: AnyCPU + Any: enabled: 0 settings: {} - - first: - Editor: Editor - second: + Editor: enabled: 1 settings: + CPU: AnyCPU DefaultValueInitialized: true - - first: - Standalone: OSXUniversal - second: + OS: OSX + Linux: + enabled: 0 + settings: + CPU: x86 + Linux64: + enabled: 0 + settings: + CPU: x86_64 + OSXIntel: + enabled: 1 + settings: + CPU: AnyCPU + OSXIntel64: enabled: 1 settings: CPU: AnyCPU + OSXUniversal: + enabled: 1 + settings: + CPU: AnyCPU + Win: + enabled: 0 + settings: + CPU: AnyCPU + Win64: + enabled: 0 + settings: + CPU: AnyCPU + iOS: + enabled: 0 + settings: + CompileFlags: + FrameworkDependencies: userData: assetBundleName: assetBundleVariant: diff --git a/Assets/AirConsole/unity-webview/Plugins/WebView.bundle/Contents/Info.plist b/Assets/AirConsole/unity-webview/Plugins/WebView.bundle/Contents/Info.plist index 186615dc..fabdc7c3 100644 --- a/Assets/AirConsole/unity-webview/Plugins/WebView.bundle/Contents/Info.plist +++ b/Assets/AirConsole/unity-webview/Plugins/WebView.bundle/Contents/Info.plist @@ -3,7 +3,7 @@ BuildMachineOSBuild - 24G231 + 24G325 CFBundleDevelopmentRegion English CFBundleExecutable diff --git a/Assets/AirConsole/unity-webview/Plugins/WebView.bundle/Contents/MacOS/WebView b/Assets/AirConsole/unity-webview/Plugins/WebView.bundle/Contents/MacOS/WebView index 19f2a22e8fb8552e26819596f69ee8fab9ff21a0..35ff43bab647b3ab8f4ba81ffcd647efa3bf543c 100755 GIT binary patch delta 97 zcmcbxU*N)ifrc%NQj-;Kb4f_*NS*7CHkjcoKJ%-*KZiy_*YQ1$2lih|QII%Z*KReL W5r~<#TTNyTa3ZLD`>LzVYF+?x>?cwH delta 97 zcmcbxU*N)ifrc%NQj-qeL;m*ZZ8>L5_dh<>k~k%Eom6kmp?0gu Xj6lq^-D)y(fD=LG+gDv>R`UV?k-aTK diff --git a/Assets/AirConsole/unity-webview/Runtime/WebViewCallback.cs b/Assets/AirConsole/unity-webview/Runtime/WebViewCallback.cs new file mode 100644 index 00000000..fa2c940a --- /dev/null +++ b/Assets/AirConsole/unity-webview/Runtime/WebViewCallback.cs @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2024 AirConsole + * + * C# proxy class implementing CWebViewPluginCallback Java interface. + * Enables direct synchronous callbacks from Java to C# without UnitySendMessage delay. + */ + +using UnityEngine; +using System; + +#if UNITY_ANDROID + +///

+/// AndroidJavaProxy implementation for CWebViewPluginCallback. +/// Java calls methods on this class directly, which then invokes WebViewObject callbacks. +/// Thread-safe: callbacks may arrive from any thread and are routed appropriately. +/// +public class WebViewCallback : AndroidJavaProxy +{ + private readonly WebViewObject _webViewObject; + + public WebViewCallback(WebViewObject webViewObject) + : base("net.gree.unitywebview.CWebViewPluginCallback") + { + _webViewObject = webViewObject ?? throw new ArgumentNullException(nameof(webViewObject)); + } + + /// + /// Called when JavaScript invokes Unity.call(). + /// + // ReSharper disable once InconsistentNaming + public void call(string message) + { + _webViewObject.CallFromJS(message); + } + + /// + /// Called when a navigation error occurs. + /// + // ReSharper disable once InconsistentNaming + public void onError(string error) + { + _webViewObject.CallOnError(error); + } + + /// + /// Called when an HTTP error response is received. + /// + // ReSharper disable once InconsistentNaming + public void onHttpError(string statusCode) + { + _webViewObject.CallOnHttpError(statusCode); + } + + /// + /// Called when page navigation starts. + /// + // ReSharper disable once InconsistentNaming + public void onStarted(string url) + { + _webViewObject.CallOnStarted(url); + } + + /// + /// Called when page navigation finishes. + /// + // ReSharper disable once InconsistentNaming + public void onLoaded(string url) + { + _webViewObject.CallOnLoaded(url); + } + + /// + /// Called when a hooked URL pattern is matched. + /// + // ReSharper disable once InconsistentNaming + public void onHooked(string url) + { + _webViewObject.CallOnHooked(url); + } + + /// + /// Called when audio focus state changes. + /// + // ReSharper disable once InconsistentNaming + public void onAudioFocusChanged(string state) + { + _webViewObject.CallOnAudioFocusChanged(state); + } + + /// + /// Called when soft keyboard visibility changes. + /// + // ReSharper disable once InconsistentNaming + public void onKeyboardVisible(string height) + { + _webViewObject.SetKeyboardVisible(height); + } + + /// + /// Called when file chooser permissions are needed. + /// + // ReSharper disable once InconsistentNaming + public void onRequestFileChooserPermissions() + { + _webViewObject.RequestFileChooserPermissions(); + } +} + +#endif diff --git a/Assets/AirConsole/unity-webview/Runtime/WebViewCallback.cs.meta b/Assets/AirConsole/unity-webview/Runtime/WebViewCallback.cs.meta new file mode 100644 index 00000000..8767a77b --- /dev/null +++ b/Assets/AirConsole/unity-webview/Runtime/WebViewCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AirConsole/unity-webview/Runtime/WebViewEvent.cs b/Assets/AirConsole/unity-webview/Runtime/WebViewEvent.cs new file mode 100644 index 00000000..ca6d4892 --- /dev/null +++ b/Assets/AirConsole/unity-webview/Runtime/WebViewEvent.cs @@ -0,0 +1,244 @@ +using System; + +/// +/// Represents a queued event in the WebView system. +/// Enqueued from any thread, dequeued and processed on the Unity main thread. +/// +public class WebViewEvent +{ + /// + /// Enumeration of all supported WebView event types. + /// Matches the message prefixes used by the native bridge. + /// + public enum EventType + { + /// JavaScript message from the WebView (CallFromJS). + Message, + /// General error from the WebView (CallOnError). + Error, + /// HTTP error from the WebView (CallOnHttpError). + HttpError, + /// Navigation started (CallOnStarted). + Started, + /// Navigation completed (CallOnLoaded). + Loaded, + /// URL hook triggered (CallOnHooked). + Hooked, + /// Cookie information retrieved (CallOnCookies). + Cookies, + /// Audio focus state changed (CallOnAudioFocusChanged). + AudioFocusChanged, + /// Keyboard visibility changed (SetKeyboardVisible). + KeyboardHeightChanged, + /// File chooser permissions requested (RequestFileChooserPermissions). + FileChooserPermissions, + /// Unknown or unrecognized event type. + Unknown + } + + /// + /// The type of this event. + /// + public EventType Type { get; private set; } + + /// + /// String payload for the event (e.g., JS message, error text, URL). + /// + public string Payload { get; private set; } + + /// + /// Integer payload for numeric data (e.g., audio focus state, keyboard height in pixels). + /// + public int IntPayload { get; private set; } + + /// + /// Float payload reserved for future use. + /// + public float FloatPayload { get; private set; } + + /// + /// Timestamp when the event was created (UTC). + /// Useful for debugging and metrics. + /// + public DateTime Timestamp { get; private set; } + + /// + /// Private constructor. Use factory methods to create events. + /// + private WebViewEvent(EventType type, string payload = null, int intPayload = 0, float floatPayload = 0f) + { + Type = type; + Payload = payload; + IntPayload = intPayload; + FloatPayload = floatPayload; + Timestamp = DateTime.UtcNow; + } + + #region Factory Methods + + /// + /// Creates a JavaScript message event. + /// + /// The message payload from JavaScript. + /// A new WebViewEvent of type Message. + public static WebViewEvent Message(string message) + { + return new WebViewEvent(EventType.Message, message); + } + + /// + /// Creates an error event. + /// + /// The error message. + /// A new WebViewEvent of type Error. + public static WebViewEvent Error(string error) + { + return new WebViewEvent(EventType.Error, error); + } + + /// + /// Creates an HTTP error event. + /// + /// The HTTP error details. + /// A new WebViewEvent of type HttpError. + public static WebViewEvent HttpError(string error) + { + return new WebViewEvent(EventType.HttpError, error); + } + + /// + /// Creates a navigation started event. + /// + /// The URL that started loading. + /// A new WebViewEvent of type Started. + public static WebViewEvent Started(string url) + { + return new WebViewEvent(EventType.Started, url); + } + + /// + /// Creates a navigation loaded event. + /// + /// The URL that finished loading. + /// A new WebViewEvent of type Loaded. + public static WebViewEvent Loaded(string url) + { + return new WebViewEvent(EventType.Loaded, url); + } + + /// + /// Creates a URL hook event. + /// + /// The hooked URL. + /// A new WebViewEvent of type Hooked. + public static WebViewEvent Hooked(string url) + { + return new WebViewEvent(EventType.Hooked, url); + } + + /// + /// Creates a cookies event. + /// + /// The cookie string. + /// A new WebViewEvent of type Cookies. + public static WebViewEvent Cookies(string cookies) + { + return new WebViewEvent(EventType.Cookies, cookies); + } + + /// + /// Creates an audio focus changed event. + /// + /// The audio focus state string. + /// A new WebViewEvent of type AudioFocusChanged. + public static WebViewEvent AudioFocusChanged(string state) + { + return new WebViewEvent(EventType.AudioFocusChanged, state); + } + + /// + /// Creates a keyboard height changed event. + /// + /// The keyboard height in pixels. + /// A new WebViewEvent of type KeyboardHeightChanged. + public static WebViewEvent KeyboardHeightChanged(int height) + { + return new WebViewEvent(EventType.KeyboardHeightChanged, height.ToString(), height); + } + + /// + /// Creates a keyboard height changed event from string. + /// + /// The keyboard height as string. + /// A new WebViewEvent of type KeyboardHeightChanged. + public static WebViewEvent KeyboardHeightChanged(string heightString) + { + int height = 0; + int.TryParse(heightString, out height); + return new WebViewEvent(EventType.KeyboardHeightChanged, heightString, height); + } + + /// + /// Creates a file chooser permissions request event. + /// + /// A new WebViewEvent of type FileChooserPermissions. + public static WebViewEvent FileChooserPermissions() + { + return new WebViewEvent(EventType.FileChooserPermissions); + } + + /// + /// Creates an event from a native bridge message string. + /// Parses the "Type:Payload" format used by the Android bridge. + /// + /// The raw message from the native bridge. + /// A new WebViewEvent, or null if the message format is invalid. + public static WebViewEvent FromNativeMessage(string message) + { + if (string.IsNullOrEmpty(message)) + return null; + + var colonIndex = message.IndexOf(':'); + if (colonIndex == -1) + return null; + + var type = message.Substring(0, colonIndex); + var payload = colonIndex + 1 < message.Length ? message.Substring(colonIndex + 1) : string.Empty; + + switch (type) + { + case "CallFromJS": + return Message(payload); + case "CallOnError": + return Error(payload); + case "CallOnHttpError": + return HttpError(payload); + case "CallOnStarted": + return Started(payload); + case "CallOnLoaded": + return Loaded(payload); + case "CallOnHooked": + return Hooked(payload); + case "CallOnCookies": + return Cookies(payload); + case "CallOnAudioFocusChanged": + return AudioFocusChanged(payload); + case "SetKeyboardVisible": + return KeyboardHeightChanged(payload); + case "RequestFileChooserPermissions": + return FileChooserPermissions(); + default: + return new WebViewEvent(EventType.Unknown, message); + } + } + + #endregion + + /// + /// Returns a string representation for debugging. + /// + public override string ToString() + { + return $"WebViewEvent[{Type}]: {Payload ?? "(no payload)"} @ {Timestamp:HH:mm:ss.fff}"; + } +} diff --git a/Assets/AirConsole/unity-webview/Plugins/Editor/UnityWebViewPostprocessBuild.cs.meta b/Assets/AirConsole/unity-webview/Runtime/WebViewEvent.cs.meta similarity index 83% rename from Assets/AirConsole/unity-webview/Plugins/Editor/UnityWebViewPostprocessBuild.cs.meta rename to Assets/AirConsole/unity-webview/Runtime/WebViewEvent.cs.meta index 2d862b52..e9feb004 100644 --- a/Assets/AirConsole/unity-webview/Plugins/Editor/UnityWebViewPostprocessBuild.cs.meta +++ b/Assets/AirConsole/unity-webview/Runtime/WebViewEvent.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 0b2f5f306eb6e4afcbc074e6efccc188 +guid: 03e8196427c59441989215be8854d79c MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/AirConsole/unity-webview/Runtime/WebViewObject.cs b/Assets/AirConsole/unity-webview/Runtime/WebViewObject.cs index 93235ad2..4c5559ff 100644 --- a/Assets/AirConsole/unity-webview/Runtime/WebViewObject.cs +++ b/Assets/AirConsole/unity-webview/Runtime/WebViewObject.cs @@ -23,7 +23,9 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Collections.Concurrent; using System.Runtime.InteropServices; +using System.Threading; #if UNITY_2018_4_OR_NEWER using UnityEngine.Networking; #endif @@ -52,8 +54,7 @@ public class UnitySendMessageDispatcher /// Target GameObject name. /// Method to call on the GameObject. /// Message payload forwarded to the receiver. - public static void Dispatch(string name, string method, string message) - { + public static void Dispatch(string name, string method, string message) { GameObject obj = GameObject.Find(name); if (obj != null) obj.SendMessage(method, message); @@ -66,6 +67,9 @@ public static void Dispatch(string name, string method, string message) ///