diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..b730ce1
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,4093 @@
+
+[*]
+charset = utf-8-bom
+end_of_line = crlf
+trim_trailing_whitespace = false
+insert_final_newline = false
+indent_style = space
+indent_size = 4
+
+# Microsoft .NET properties
+csharp_indent_switch_labels = true
+csharp_new_line_before_catch = true
+csharp_new_line_before_else = true
+csharp_new_line_before_finally = true
+csharp_new_line_before_members_in_object_initializers = false
+csharp_new_line_before_open_brace = all
+csharp_new_line_between_query_expression_clauses = true
+csharp_preferred_modifier_order = public, protected, internal, private, file, new, static, sealed, abstract, virtual, 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 = block_scoped:error
+csharp_style_prefer_utf8_string_literals = true:suggestion
+csharp_style_var_elsewhere = false:warning
+csharp_style_var_for_built_in_types = false:warning
+csharp_style_var_when_type_is_apparent = false:warning
+csharp_using_directive_placement = outside_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.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.severity = warning
+dotnet_naming_rule.event_rule.style = upper_camel_case_style
+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_exclusive_prefixes_suffixes = true
+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
+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
+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
+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_exclusive_prefixes_suffixes = true
+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_1
+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 = s_lower_camel_case_style
+dotnet_naming_rule.private_static_fields_rule.symbols = private_static_fields_symbols
+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.private_static_readonly_rule.symbols = private_static_readonly_symbols
+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.severity = warning
+dotnet_naming_rule.property_rule.style = upper_camel_case_style
+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_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_1.capitalization = camel_case
+dotnet_naming_style.lower_camel_case_style_1.required_prefix = _
+dotnet_naming_style.s_lower_camel_case_style.capitalization = camel_case
+dotnet_naming_style.s_lower_camel_case_style.required_prefix = s_
+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_static_fields_symbols.applicable_accessibilities = private
+dotnet_naming_symbols.private_static_fields_symbols.applicable_kinds = field
+dotnet_naming_symbols.private_static_fields_symbols.required_modifiers = static
+dotnet_naming_symbols.private_static_fields_symbols.resharper_applicable_kinds = field
+dotnet_naming_symbols.private_static_fields_symbols.resharper_required_modifiers = static
+dotnet_naming_symbols.private_static_readonly_symbols.applicable_accessibilities = private
+dotnet_naming_symbols.private_static_readonly_symbols.applicable_kinds = field
+dotnet_naming_symbols.private_static_readonly_symbols.required_modifiers = readonly,static
+dotnet_naming_symbols.private_static_readonly_symbols.resharper_applicable_kinds = readonly_field
+dotnet_naming_symbols.private_static_readonly_symbols.resharper_required_modifiers = static
+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_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:error
+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 = expression_body
+resharper_alignment_tab_fill_style = use_spaces
+resharper_align_first_arg_by_paren = false
+resharper_align_linq_query = true
+resharper_align_multiline_argument = true
+resharper_align_multiline_array_and_object_initializer = false
+resharper_align_multiline_array_initializer = true
+resharper_align_multiline_binary_patterns = true
+resharper_align_multiline_calls_chain = true
+resharper_align_multiline_comments = true
+resharper_align_multiline_ctor_init = true
+resharper_align_multiline_expression_braces = false
+resharper_align_multiline_extends_list = true
+resharper_align_multiline_implements_list = true
+resharper_align_multiline_list_pattern = false
+resharper_align_multiline_parameter = true
+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 = true
+resharper_align_multiline_type_parameter_list = true
+resharper_align_multiple_declaration = true
+resharper_align_ternary = align_not_nested
+resharper_align_tuple_components = true
+resharper_allow_alias = true
+resharper_allow_comment_after_lbrace = false
+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 = true
+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 = 1
+resharper_blank_lines_after_file_scoped_namespace_directive = 1
+resharper_blank_lines_after_imports = 1
+resharper_blank_lines_after_multiline_statements = 1
+resharper_blank_lines_after_options = 1
+resharper_blank_lines_after_start_comment = 1
+resharper_blank_lines_after_using_list = 1
+resharper_blank_lines_around_accessor = 0
+resharper_blank_lines_around_auto_property = 0
+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_function_declaration = 0
+resharper_blank_lines_around_function_definition = 1
+resharper_blank_lines_around_global_attribute = 0
+resharper_blank_lines_around_local_method = 0
+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 = 0
+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 = 0
+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 = 0
+resharper_blank_lines_inside_namespace = 0
+resharper_blank_lines_inside_region = 1
+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 = true
+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_binary_expressions_chain = false
+resharper_cpp_align_multiline_for_stmt = true
+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_int_align_comments = false
+resharper_cpp_invocable_declaration_braces = next_line
+resharper_cpp_keep_blank_lines_in_code = 2
+resharper_cpp_keep_blank_lines_in_declarations = 2
+resharper_cpp_keep_existing_arrangement = true
+resharper_cpp_max_enum_members_on_line = 3
+resharper_cpp_max_line_length = 120
+resharper_cpp_new_line_before_while = true
+resharper_cpp_other_braces = next_line
+resharper_cpp_place_simple_blocks_on_single_line = false
+resharper_cpp_place_type_constraints_on_same_line = true
+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_cpp_wrap_parameters_style = wrap_if_long
+resharper_cpp_wrap_ternary_expr_style = chop_if_long
+resharper_csharp_align_multiline_binary_expressions_chain = true
+resharper_csharp_align_multiline_expression = false
+resharper_csharp_align_multiline_for_stmt = false
+resharper_csharp_allow_far_alignment = false
+resharper_csharp_anonymous_method_declaration_braces = next_line_shifted_2
+resharper_csharp_blank_lines_around_field = 0
+resharper_csharp_blank_lines_around_invocable = 0
+resharper_csharp_empty_block_style = together_same_line
+resharper_csharp_insert_final_newline = true
+resharper_csharp_int_align_comments = true
+resharper_csharp_keep_blank_lines_in_code = 1
+resharper_csharp_keep_blank_lines_in_declarations = 1
+resharper_csharp_keep_existing_enum_arrangement = false
+resharper_csharp_keep_nontrivial_alias = false
+resharper_csharp_max_enum_members_on_line = 1
+resharper_csharp_max_line_length = 80
+resharper_csharp_new_line_before_while = false
+resharper_csharp_place_type_constraints_on_same_line = false
+resharper_csharp_prefer_qualified_reference = false
+resharper_csharp_space_after_unary_operator = false
+resharper_csharp_stick_comment = false
+resharper_csharp_wrap_lines = true
+resharper_csharp_wrap_parameters_style = chop_if_long
+resharper_csharp_wrap_ternary_expr_style = chop_always
+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 = join
+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_max_line_length = 120
+resharper_fsharp_stick_comment = true
+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_max_line_length = 120
+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_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 = true
+resharper_indent_nested_for_stmt = true
+resharper_indent_nested_lock_stmt = false
+resharper_indent_nested_usings_stmt = false
+resharper_indent_nested_while_stmt = true
+resharper_indent_pars = inside
+resharper_indent_preprocessor_directives = none
+resharper_indent_preprocessor_if = no_indent
+resharper_indent_preprocessor_other = no_indent
+resharper_indent_preprocessor_region = no_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_assignments = true
+resharper_int_align_binary_expressions = false
+resharper_int_align_bitfield_sizes = false
+resharper_int_align_declaration_names = false
+resharper_int_align_enum_initializers = false
+resharper_int_align_eq = false
+resharper_int_align_fields = true
+resharper_int_align_fix_in_adjacent = true
+resharper_int_align_invocations = false
+resharper_int_align_methods = true
+resharper_int_align_nested_ternary = true
+resharper_int_align_parameters = true
+resharper_int_align_properties = true
+resharper_int_align_property_patterns = false
+resharper_int_align_switch_expressions = true
+resharper_int_align_switch_sections = true
+resharper_int_align_variables = true
+resharper_keep_existing_attribute_arrangement = false
+resharper_keep_existing_declaration_block_arrangement = false
+resharper_keep_existing_declaration_parens_arrangement = false
+resharper_keep_existing_embedded_arrangement = false
+resharper_keep_existing_embedded_block_arrangement = false
+resharper_keep_existing_expr_member_arrangement = false
+resharper_keep_existing_invocation_parens_arrangement = false
+resharper_keep_existing_line_break_before_declaration_body = true
+resharper_keep_existing_list_patterns_arrangement = false
+resharper_keep_existing_primary_constructor_declaration_parens_arrangement = false
+resharper_keep_existing_property_patterns_arrangement = false
+resharper_keep_existing_switch_expression_arrangement = false
+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 = block_body
+resharper_macro_block_begin =
+resharper_macro_block_end =
+resharper_max_array_initializer_elements_on_line = 5
+resharper_max_attribute_length_for_same_line = 40
+resharper_max_formal_parameters_on_line = 5
+resharper_max_initializer_elements_on_line = 5
+resharper_max_invocation_arguments_on_line = 5
+resharper_max_primary_constructor_parameters_on_line = 5
+resharper_member_initializer_list_style = do_not_change
+resharper_method_or_operator_body = block_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_catch = true
+resharper_new_line_before_else = 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 = empty_recursive_pattern
+resharper_object_creation_when_type_evident = explicitly_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 = true
+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 = false
+resharper_place_simple_initializer_on_single_line = true
+resharper_place_simple_list_pattern_on_single_line = false
+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_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 = true
+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_max_line_length = 2147483647
+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_max_line_length = 120
+resharper_shaderlab_wrap_lines = true
+resharper_show_autodetect_configure_formatting_tip = true
+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 = true
+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_support_vs_event_naming_pattern = true
+resharper_T4_allow_far_alignment = false
+resharper_T4_insert_final_newline = false
+resharper_T4_max_line_length = 120
+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 = true
+resharper_trailing_comma_in_singleline_lists = true
+resharper_treat_case_statement_with_break_as_simple = false
+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 = false
+resharper_vb_align_multiline_expression = true
+resharper_vb_allow_far_alignment = false
+resharper_vb_blank_lines_around_field = 1
+resharper_vb_blank_lines_around_invocable = 1
+resharper_vb_insert_final_newline = false
+resharper_vb_keep_blank_lines_in_code = 2
+resharper_vb_keep_blank_lines_in_declarations = 2
+resharper_vb_keep_nontrivial_alias = true
+resharper_vb_max_line_length = 120
+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_stick_comment = true
+resharper_vb_wrap_lines = true
+resharper_vb_wrap_parameters_style = wrap_if_long
+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 = false
+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 = chop_if_long
+resharper_wrap_base_clause_style = wrap_if_long
+resharper_wrap_before_arrow_with_expressions = false
+resharper_wrap_before_binary_opsign = 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 = false
+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 = false
+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 = chop_if_long
+resharper_wrap_chained_method_calls = wrap_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_linq_expressions = chop_always
+resharper_wrap_list_pattern = chop_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_primary_constructor_parameters_style = chop_if_long
+resharper_wrap_property_pattern = chop_if_long
+resharper_wrap_switch_expression = chop_always
+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_max_line_length = 80
+resharper_xmldoc_pi_attribute_style = do_not_touch
+resharper_xmldoc_space_before_self_closing = true
+resharper_xmldoc_wrap_lines = true
+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_max_line_length = 120
+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 = none
+resharper_arguments_style_literal_highlighting = none
+resharper_arguments_style_named_expression_highlighting = none
+resharper_arguments_style_other_highlighting = none
+resharper_arguments_style_string_literal_highlighting = none
+resharper_arrange_accessor_owner_body_highlighting = suggestion
+resharper_arrange_attributes_highlighting = suggestion
+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 = suggestion
+resharper_arrange_local_function_body_highlighting = none
+resharper_arrange_method_or_operator_body_highlighting = suggestion
+resharper_arrange_null_checking_pattern_highlighting = hint
+resharper_arrange_object_creation_when_type_evident_highlighting = error
+resharper_arrange_object_creation_when_type_not_evident_highlighting = error
+resharper_arrange_redundant_parentheses_highlighting = suggestion
+resharper_arrange_static_member_qualifier_highlighting = hint
+resharper_arrange_this_qualifier_highlighting = hint
+resharper_arrange_trailing_comma_in_multiline_lists_highlighting = warning
+resharper_arrange_trailing_comma_in_singleline_lists_highlighting = warning
+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_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 = warning
+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_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_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_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_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_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_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_cplusplus_virtual_call_modeling_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_nullability_base_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_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_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_binding_in_condition_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_cf_string_literal_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_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_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_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_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_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_no_relaxed_template_template_args_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_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_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_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_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_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_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_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_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_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_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_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_static_assert_highlighting = none
+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_import_in_extern_c_highlighting = warning
+resharper_cpp_clang_tidy_clang_diagnostic_msvc_not_found_highlighting = warning
+resharper_cpp_clang_tidy_clang_diagnostic_multichar_highlighting = none
+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_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_odr_highlighting = warning
+resharper_cpp_clang_tidy_clang_diagnostic_old_style_cast_highlighting = none
+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_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_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_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_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_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_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_underaligned_exception_object_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_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_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_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_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_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_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_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_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_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_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_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_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_enforce_do_while_statement_braces_highlighting = warning
+resharper_enforce_fixed_statement_braces_highlighting = warning
+resharper_enforce_foreach_statement_braces_highlighting = warning
+resharper_enforce_for_statement_braces_highlighting = warning
+resharper_enforce_if_statement_braces_highlighting = warning
+resharper_enforce_lock_statement_braces_highlighting = warning
+resharper_enforce_using_statement_braces_highlighting = warning
+resharper_enforce_while_statement_braces_highlighting = warning
+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_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_deconstruction_declarations_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_must_be_surrounded_with_ref_rw_ro_highlighting = warning
+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
+
+[*.{appxmanifest,asax,ascx,aspx,axaml,blockshader,c,c++,c++m,cc,ccm,cginc,compute,cp,cpp,cppm,cs,cshtml,cu,cuh,cxx,cxxm,dtd,fs,fsi,fsscript,fsx,fx,fxh,h,h++,hh,hlsl,hlsli,hlslinc,hp,hpp,hxx,icc,inc,inl,ino,ipp,ixx,master,ml,mli,mpp,mq4,mq5,mqh,mxx,nuspec,paml,razor,resw,resx,shader,shaderFoundry,skin,tcc,tpp,urtshader,usf,ush,uxml,vb,xaml,xamlx,xoml,xsd}]
+indent_style = space
+indent_size = 4
+tab_width = 4
diff --git a/.github/workflows/package-and-push.yml b/.github/workflows/package-and-push.yml
index 8f205b9..c5ef88b 100644
--- a/.github/workflows/package-and-push.yml
+++ b/.github/workflows/package-and-push.yml
@@ -11,7 +11,7 @@ on:
env:
NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
REPOSITORY_URL: https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json
- PROJECT_NAME: Networking
+ PROJECT_NAME: FluffyVoid.Networking
jobs:
build:
runs-on: ubuntu-latest
diff --git a/Networking.sln b/FluffyVoid.Networking.sln
similarity index 77%
rename from Networking.sln
rename to FluffyVoid.Networking.sln
index 8b10dfe..7ed17d2 100644
--- a/Networking.sln
+++ b/FluffyVoid.Networking.sln
@@ -1,6 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Networking", "Networking\Networking.csproj", "{9B154867-05CF-4C18-B61F-AD4DCC01B71F}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FluffyVoid.Networking", "FluffyVoid.Networking\FluffyVoid.Networking.csproj", "{9B154867-05CF-4C18-B61F-AD4DCC01B71F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
diff --git a/FluffyVoid.Networking.sln.DotSettings b/FluffyVoid.Networking.sln.DotSettings
new file mode 100644
index 0000000..f0e5bb3
--- /dev/null
+++ b/FluffyVoid.Networking.sln.DotSettings
@@ -0,0 +1,449 @@
+
+ <Patterns xmlns="urn:schemas-jetbrains-com:member-reordering-patterns"
+ xmlns:unity="urn:schemas-jetbrains-com:member-reordering-patterns-unity">
+
+ <!-- Pattern to match classes used by Unity that contain serialised fields
+ and event function methods. Based on the standard "Default Pattern",
+ this will also order event functions before normal methods, and does
+ not reorder serialised fields, as this order is reflected in the Unity
+ editor's Inspector -->
+ <TypePattern DisplayName="Unity classes" Priority="100">
+ <TypePattern.Match>
+ <unity:SerializableClass />
+ </TypePattern.Match>
+ <Entry DisplayName="Constants">
+ <Entry.Match>
+ <Kind Is="Constant" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Structs">
+ <Entry.Match>
+ <Kind Is="Struct" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Enums">
+ <Entry.Match>
+ <Kind Is="Enum" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Classes">
+ <Entry.Match>
+ <Kind Is="Class" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Delegates">
+ <Entry.Match>
+ <Kind Is="Delegate" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Fields">
+ <Entry.Match>
+ <Kind Is="Field" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Properties">
+ <Entry.Match>
+ <Kind Is="Property" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Indexers">
+ <Entry.Match>
+ <Kind Is="Indexer" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Events">
+ <Entry.Match>
+ <Kind Is="Event" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Constructors">
+ <Entry.Match>
+ <Kind Is="Constructor" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Destructors">
+ <Entry.Match>
+ <Kind Is="Destructor" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Unity Event Functions">
+ <Entry.Match>
+ <unity:EventFunction />
+ </Entry.Match>
+
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Interfaces">
+ <Entry.Match>
+ <Kind Is="Interface" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Methods">
+ <Entry.Match>
+ <Kind Is="Method" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ </TypePattern>
+</Patterns>
+
+ SUGGESTION
+ SUGGESTION
+ SUGGESTION
+ SUGGESTION
+ ERROR
+ ERROR
+ ERROR
+ SUGGESTION
+ WARNING
+ WARNING
+ ERROR
+ ERROR
+ SUGGESTION
+ SUGGESTION
+ WARNING
+ WARNING
+ WARNING
+ WARNING
+ WARNING
+ WARNING
+ WARNING
+ WARNING
+ WARNING
+ WARNING
+ WARNING
+ Built-in: Full Cleanup
+ Required
+ Required
+ Required
+ Required
+ Join
+ public protected internal private file new static sealed abstract virtual readonly override extern unsafe volatile async required
+ BlockScoped
+ EmptyRecursivePattern
+ ExplicitlyTyped
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ NEXT_LINE_SHIFTED_2
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ TOGETHER_SAME_LINE
+ True
+ True
+ True
+ NO_INDENT
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ 1
+ 1
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ True
+ 5
+ 40
+ 1
+ 5
+ 5
+ 5
+ 5
+ NEVER
+ NEVER
+ NEVER
+ NEVER
+ False
+ False
+ True
+ False
+ False
+ False
+ CHOP_IF_LONG
+ CHOP_IF_LONG
+ CHOP_IF_LONG
+ 80
+ CHOP_ALWAYS
+ CHOP_IF_LONG
+ CHOP_IF_LONG
+ CHOP_ALWAYS
+ 80
+ <Patterns xmlns="urn:schemas-jetbrains-com:member-reordering-patterns">
+ <TypePattern DisplayName="StyleCop Classes, Interfaces, & Structs" RemoveRegions="All">
+ <TypePattern.Match>
+ <Or>
+ <Kind Is="Class" />
+ <Kind Is="Struct" />
+ <Kind Is="Interface" />
+ </Or>
+ </TypePattern.Match>
+ <Entry DisplayName="Constants">
+ <Entry.Match>
+ <Kind Is="Constant" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Structs">
+ <Entry.Match>
+ <Kind Is="Struct" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Enums">
+ <Entry.Match>
+ <Kind Is="Enum" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Classes">
+ <Entry.Match>
+ <Kind Is="Class" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Delegates">
+ <Entry.Match>
+ <Kind Is="Delegate" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Fields">
+ <Entry.Match>
+ <Kind Is="Field" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Properties">
+ <Entry.Match>
+ <Kind Is="Property" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Indexers">
+ <Entry.Match>
+ <Kind Is="Indexer" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Events">
+ <Entry.Match>
+ <Kind Is="Event" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Constructors">
+ <Entry.Match>
+ <Kind Is="Constructor" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Destructors">
+ <Entry.Match>
+ <Kind Is="Destructor" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Interfaces">
+ <Entry.Match>
+ <Kind Is="Interface" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ <Entry DisplayName="Methods">
+ <Entry.Match>
+ <Kind Is="Method" />
+ </Entry.Match>
+ <Entry.SortBy>
+ <Access Order="Public Internal Protected ProtectedInternal Private" />
+ <Name/>
+ <Static />
+ <Readonly />
+ </Entry.SortBy>
+ </Entry>
+ </TypePattern>
+</Patterns>
+
+ UseExplicitType
+ UseExplicitType
+ UseExplicitType
+ True
+ True
+ False
+
+ True
+ <Policy><Descriptor Staticness="Static" AccessRightKinds="Private" Description="Static fields (private)"><ElementKinds><Kind Name="FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="True" Prefix="s_" Suffix="" Style="aaBb" /></Policy>
+ True
+ True
+ True
+ True
+ True
+ True
\ No newline at end of file
diff --git a/Networking/Networking.csproj b/FluffyVoid.Networking/FluffyVoid.Networking.csproj
similarity index 86%
rename from Networking/Networking.csproj
rename to FluffyVoid.Networking/FluffyVoid.Networking.csproj
index 51deba6..d83f8d3 100644
--- a/Networking/Networking.csproj
+++ b/FluffyVoid.Networking/FluffyVoid.Networking.csproj
@@ -2,7 +2,7 @@
netstandard2.1
- latestmajor
+ 13
enable
enable
FluffyVoid.Networking
@@ -12,10 +12,10 @@
FluffyVoid
C# tools and utilities for handling Networking operations in an application.
FluffyVoid
- 1.0.1
- 1.0.1
+ 1.0.2
+ 1.0.2
https://github.com/ashiryn/Networking
- 1.0.1
+ 1.0.2
@@ -27,8 +27,8 @@
-
-
+
+
diff --git a/FluffyVoid.Networking/FluffyVoid.Networking.csproj.DotSettings b/FluffyVoid.Networking/FluffyVoid.Networking.csproj.DotSettings
new file mode 100644
index 0000000..338ad07
--- /dev/null
+++ b/FluffyVoid.Networking/FluffyVoid.Networking.csproj.DotSettings
@@ -0,0 +1,2 @@
+
+ True
\ No newline at end of file
diff --git a/FluffyVoid.Networking/Udp/ClientConnectionInformation.cs b/FluffyVoid.Networking/Udp/ClientConnectionInformation.cs
new file mode 100644
index 0000000..c019066
--- /dev/null
+++ b/FluffyVoid.Networking/Udp/ClientConnectionInformation.cs
@@ -0,0 +1,84 @@
+namespace FluffyVoid.Networking.Udp
+{
+ ///
+ /// Data class used to store information about a clients connection
+ ///
+ public class ClientConnectionInformation : IUdpSerializable
+ {
+ ///
+ /// The id that was assigned to the client
+ ///
+ public short Id { get; private set; }
+ ///
+ /// The name of the client
+ ///
+ public string Name { get; private set; }
+ ///
+ /// Whether the connection was successful or not
+ ///
+ public bool Successful { get; private set; }
+
+ ///
+ /// Default constructor for the data class ensuring proper deserialization
+ ///
+ public ClientConnectionInformation()
+ {
+ Name = string.Empty;
+ }
+ ///
+ /// Constructor used to initialize the data class with a clients name
+ ///
+ ///
+ /// Most often used by the client to request a connection to the server
+ ///
+ /// The name the client will be connecting as
+ public ClientConnectionInformation(string name)
+ {
+ Name = name;
+ }
+ ///
+ /// Constructor used to initialize the data class
+ ///
+ ///
+ /// Most often used by the server to inform the connecting client if the
+ /// connection was successful and their new client
+ /// ID
+ ///
+ /// The name the client will be connecting as
+ /// The id that is to be assigned to the client
+ /// Whether the connection was successful or not
+ public ClientConnectionInformation(string name, short id, bool success)
+ {
+ Name = name;
+ Id = id;
+ Successful = success;
+ }
+ ///
+ /// Deserialization method used to deserialize the data in this class from a
+ /// network byte stream
+ ///
+ ///
+ /// The serialization event arg to use in the deserialization
+ /// process
+ ///
+ public void Deserialize(UdpDeserializerEventArgs e)
+ {
+ Name = e.Reader.ReadString();
+ Id = e.Reader.ReadShort();
+ Successful = e.Reader.ReadBool();
+ }
+
+ ///
+ /// Serialization method used to serialize the data in this class to a network
+ /// byte stream
+ ///
+ /// The serialization event arg to use in the serialization process
+ public int Serialize(UdpSerializerEventArgs e)
+ {
+ int count = e.Writer.WriteString(Name);
+ count += e.Writer.WriteShort(Id);
+ count += e.Writer.WriteBool(Successful);
+ return count;
+ }
+ }
+}
diff --git a/Networking/Udp/ClientInformation.cs b/FluffyVoid.Networking/Udp/ClientInformation.cs
similarity index 90%
rename from Networking/Udp/ClientInformation.cs
rename to FluffyVoid.Networking/Udp/ClientInformation.cs
index 5050fb4..ff4aba8 100644
--- a/Networking/Udp/ClientInformation.cs
+++ b/FluffyVoid.Networking/Udp/ClientInformation.cs
@@ -7,22 +7,22 @@ namespace FluffyVoid.Networking.Udp
///
public class ClientInformation
{
- ///
- /// The id assigned to the client
- ///
- public short Id { get; }
- ///
- /// The name of the client
- ///
- public string Name { get; }
///
/// The ip endpoint address of the client
///
public IPEndPoint Endpoint { get; }
///
+ /// The id assigned to the client
+ ///
+ public short Id { get; }
+ ///
/// Whether the client is currently active via the heartbeat system
///
public bool IsAlive { get; set; }
+ ///
+ /// The name of the client
+ ///
+ public string Name { get; }
///
/// Constructor used to initialize the client information
@@ -32,10 +32,10 @@ public class ClientInformation
/// The ip endpoint address of the client
public ClientInformation(short id, string name, IPEndPoint endPoint)
{
- Id = id;
- Name = name;
+ Id = id;
+ Name = name;
Endpoint = endPoint;
- IsAlive = true;
+ IsAlive = true;
}
}
}
diff --git a/FluffyVoid.Networking/Udp/ClientMessageTagRegistration.cs b/FluffyVoid.Networking/Udp/ClientMessageTagRegistration.cs
new file mode 100644
index 0000000..6044737
--- /dev/null
+++ b/FluffyVoid.Networking/Udp/ClientMessageTagRegistration.cs
@@ -0,0 +1,77 @@
+using FluffyVoid.Utilities;
+
+namespace FluffyVoid.Networking.Udp
+{
+ ///
+ /// Serializable data class that a client can send to register receiving
+ /// messages for the desired tags only
+ ///
+ public class ClientMessageTagRegistration : IUdpSerializable
+ {
+ ///
+ /// The list of tags to register to
+ ///
+ private List _tags;
+
+ ///
+ /// Constructor used to set up the tags to register
+ ///
+ /// Param list of tags to register
+ public ClientMessageTagRegistration(params ushort[] tagsToRegister)
+ {
+ _tags = new List(tagsToRegister);
+ }
+ ///
+ /// Constructor used to set up the tags to register to via enum
+ ///
+ /// Param list of enum tags to register
+ public ClientMessageTagRegistration(params Enum[] tagsToRegister)
+ {
+ _tags = new List(tagsToRegister.Select(x => x.ToUshort()));
+ }
+ ///
+ /// Constructor used to set up the tags to register
+ ///
+ /// Param list of tags to register
+ public ClientMessageTagRegistration(List tagsToRegister)
+ {
+ _tags = new List(tagsToRegister);
+ }
+ ///
+ /// Constructor used to set up the tags to register to via enum
+ ///
+ /// Param list of enum tags to register
+ public ClientMessageTagRegistration(List tagsToRegister)
+ {
+ _tags = new List(tagsToRegister.Select(x => x.ToUshort()));
+ }
+ ///
+ /// Deserializes the list of tags from an udp stream
+ ///
+ /// The deserializer args to use in deserializing the data
+ public void Deserialize(UdpDeserializerEventArgs e)
+ {
+ ushort count = e.Reader.ReadUshort();
+ _tags = new List();
+ for (int index = 0; index < count; ++index)
+ {
+ _tags.Add(e.Reader.ReadUshort());
+ }
+ }
+
+ ///
+ /// Serializes the list of tags to an udp stream
+ ///
+ /// The serializer args to use in serializing the data
+ public int Serialize(UdpSerializerEventArgs e)
+ {
+ int count = e.Writer.WriteUshort((ushort)_tags.Count);
+ foreach (ushort currentTag in _tags)
+ {
+ count += e.Writer.WriteUshort(currentTag);
+ }
+
+ return count;
+ }
+ }
+}
diff --git a/FluffyVoid.Networking/Udp/EventArguments/ClientConnectedEventArgs.cs b/FluffyVoid.Networking/Udp/EventArguments/ClientConnectedEventArgs.cs
new file mode 100644
index 0000000..ab03b58
--- /dev/null
+++ b/FluffyVoid.Networking/Udp/EventArguments/ClientConnectedEventArgs.cs
@@ -0,0 +1,24 @@
+// ReSharper disable UnusedAutoPropertyAccessor.Global
+
+namespace FluffyVoid.Networking.Udp
+{
+ ///
+ /// Event arg for use when a client has connected to an endpoint
+ ///
+ public class ClientConnectedEventArgs : EventArgs
+ {
+ ///
+ /// The client information to send with the event arg
+ ///
+ public ClientConnectionInformation ClientInfo { get; }
+
+ ///
+ /// Constructor used to initialize the event arg
+ ///
+ /// The client information data to store
+ public ClientConnectedEventArgs(ClientConnectionInformation info)
+ {
+ ClientInfo = info;
+ }
+ }
+}
diff --git a/FluffyVoid.Networking/Udp/EventArguments/ClientDisconnectedEventArgs.cs b/FluffyVoid.Networking/Udp/EventArguments/ClientDisconnectedEventArgs.cs
new file mode 100644
index 0000000..87a7b08
--- /dev/null
+++ b/FluffyVoid.Networking/Udp/EventArguments/ClientDisconnectedEventArgs.cs
@@ -0,0 +1,34 @@
+// ReSharper disable UnusedAutoPropertyAccessor.Global
+
+namespace FluffyVoid.Networking.Udp
+{
+ ///
+ /// Event arg for use when a client has disconnected from an endpoint
+ ///
+ public class ClientDisconnectedEventArgs : EventArgs
+ {
+ ///
+ /// The client information to send with the event arg
+ ///
+ public ClientConnectionInformation ClientInfo { get; }
+ ///
+ /// Whether the disconnect was initiated by the connected client or not
+ ///
+ public bool IsLocalDisconnect { get; }
+
+ ///
+ /// Constructor used to initialize the event arg
+ ///
+ ///
+ /// Whether the disconnect was initiated by the
+ /// connected client or not
+ ///
+ /// The client information data to store
+ public ClientDisconnectedEventArgs(bool isLocalDisconnect,
+ ClientConnectionInformation info)
+ {
+ IsLocalDisconnect = isLocalDisconnect;
+ ClientInfo = info;
+ }
+ }
+}
diff --git a/Networking/Udp/EventArguments/INetworkMessageEventArgs.cs b/FluffyVoid.Networking/Udp/EventArguments/INetworkMessageEventArgs.cs
similarity index 66%
rename from Networking/Udp/EventArguments/INetworkMessageEventArgs.cs
rename to FluffyVoid.Networking/Udp/EventArguments/INetworkMessageEventArgs.cs
index a6acc35..f945e7c 100644
--- a/Networking/Udp/EventArguments/INetworkMessageEventArgs.cs
+++ b/FluffyVoid.Networking/Udp/EventArguments/INetworkMessageEventArgs.cs
@@ -3,8 +3,11 @@
///
/// Defines a contract for network message event args
///
- /// The type of network message the args is responsible for
- public interface INetworkMessageEventArgs
+ ///
+ /// The type of network message the args is
+ /// responsible for
+ ///
+ public interface INetworkMessageEventArgs
where TNetworkMessage : INetworkMessage
{
///
diff --git a/FluffyVoid.Networking/Udp/EventArguments/UdpDeserializerEventArgs.cs b/FluffyVoid.Networking/Udp/EventArguments/UdpDeserializerEventArgs.cs
new file mode 100644
index 0000000..3f6d2d1
--- /dev/null
+++ b/FluffyVoid.Networking/Udp/EventArguments/UdpDeserializerEventArgs.cs
@@ -0,0 +1,22 @@
+namespace FluffyVoid.Networking.Udp
+{
+ ///
+ /// Event arg used for deserializing custom classes from a UDP network stream
+ ///
+ public class UdpDeserializerEventArgs : EventArgs
+ {
+ ///
+ /// Reference to the UdpReader assigned to the network stream
+ ///
+ public UdpReader Reader { get; }
+
+ ///
+ /// Constructor used to pass the UdpReader as part of the event arg
+ ///
+ /// The reader to assign to the event arg
+ public UdpDeserializerEventArgs(UdpReader reader)
+ {
+ Reader = reader;
+ }
+ }
+}
diff --git a/FluffyVoid.Networking/Udp/EventArguments/UdpMessageEventArgs.cs b/FluffyVoid.Networking/Udp/EventArguments/UdpMessageEventArgs.cs
new file mode 100644
index 0000000..affdd74
--- /dev/null
+++ b/FluffyVoid.Networking/Udp/EventArguments/UdpMessageEventArgs.cs
@@ -0,0 +1,26 @@
+namespace FluffyVoid.Networking.Udp
+{
+ ///
+ /// Event arg for use when receiving a UDP message
+ ///
+ public class UdpMessageEventArgs
+ : EventArgs, INetworkMessageEventArgs
+ {
+ ///
+ /// The Udp message to send with the event arg
+ ///
+ public UdpMessage Message { get; }
+ ///
+ /// The tag associated with the message
+ ///
+ public ushort Tag => Message.Tag;
+ ///
+ /// Constructor used to initialize the event arg
+ ///
+ /// The udp message to store
+ public UdpMessageEventArgs(UdpMessage message)
+ {
+ Message = message;
+ }
+ }
+}
diff --git a/FluffyVoid.Networking/Udp/EventArguments/UdpSendByNameRequestEventArgs.cs b/FluffyVoid.Networking/Udp/EventArguments/UdpSendByNameRequestEventArgs.cs
new file mode 100644
index 0000000..72d86b4
--- /dev/null
+++ b/FluffyVoid.Networking/Udp/EventArguments/UdpSendByNameRequestEventArgs.cs
@@ -0,0 +1,30 @@
+// ReSharper disable UnusedAutoPropertyAccessor.Global
+
+namespace FluffyVoid.Networking.Udp
+{
+ ///
+ /// Event args used to store UDP message information for a client by Name
+ ///
+ public class UdpSendByNameRequestEventArgs : EventArgs
+ {
+ ///
+ /// The message to send to the client
+ ///
+ public UdpMessage Message { get; }
+ ///
+ /// Name of the client the message is intended for
+ ///
+ public string Name { get; }
+
+ ///
+ /// Constructor used to initialize the data
+ ///
+ /// Name of the client the message is intended for
+ /// The message to send to the client
+ public UdpSendByNameRequestEventArgs(string name, UdpMessage message)
+ {
+ Name = name;
+ Message = message;
+ }
+ }
+}
diff --git a/FluffyVoid.Networking/Udp/EventArguments/UdpSendByTagRequestEventArgs.cs b/FluffyVoid.Networking/Udp/EventArguments/UdpSendByTagRequestEventArgs.cs
new file mode 100644
index 0000000..a8d400e
--- /dev/null
+++ b/FluffyVoid.Networking/Udp/EventArguments/UdpSendByTagRequestEventArgs.cs
@@ -0,0 +1,31 @@
+// ReSharper disable UnusedAutoPropertyAccessor.Global
+
+namespace FluffyVoid.Networking.Udp
+{
+ ///
+ /// Event args used to store UDP message information for a client by Tag
+ ///
+ public class UdpSendByTagRequestEventArgs : EventArgs
+ {
+ ///
+ /// The message to send to the client
+ ///
+
+ public UdpMessage Message { get; }
+ ///
+ /// Name of the client the message is intended for
+ ///
+ public string Name { get; }
+
+ ///
+ /// Constructor used to initialize the data
+ ///
+ /// Name of the client the message is intended for
+ /// The message to send to the client
+ public UdpSendByTagRequestEventArgs(string name, UdpMessage message)
+ {
+ Name = name;
+ Message = message;
+ }
+ }
+}
diff --git a/FluffyVoid.Networking/Udp/EventArguments/UdpSerializerEventArgs.cs b/FluffyVoid.Networking/Udp/EventArguments/UdpSerializerEventArgs.cs
new file mode 100644
index 0000000..5e07f01
--- /dev/null
+++ b/FluffyVoid.Networking/Udp/EventArguments/UdpSerializerEventArgs.cs
@@ -0,0 +1,22 @@
+namespace FluffyVoid.Networking.Udp
+{
+ ///
+ /// Event arg used for serializing custom classes to a UDP network stream
+ ///
+ public class UdpSerializerEventArgs : EventArgs
+ {
+ ///
+ /// Reference to the UdpWriter assigned to the network stream
+ ///
+ public UdpWriter Writer { get; }
+
+ ///
+ /// Constructor used to pass the UdpWriter as part of the event arg
+ ///
+ /// The writer to assign to the event arg
+ public UdpSerializerEventArgs(UdpWriter writer)
+ {
+ Writer = writer;
+ }
+ }
+}
diff --git a/FluffyVoid.Networking/Udp/GlobalUdpMessageTag.cs b/FluffyVoid.Networking/Udp/GlobalUdpMessageTag.cs
new file mode 100644
index 0000000..b98d299
--- /dev/null
+++ b/FluffyVoid.Networking/Udp/GlobalUdpMessageTag.cs
@@ -0,0 +1,34 @@
+namespace FluffyVoid.Networking.Udp
+{
+ ///
+ /// Enumeration for globally shared upd tags that the udp networking utilizes
+ ///
+ public enum GlobalUdpMessageTag : ushort
+ {
+ ///
+ /// Message tag used for client connect messages
+ ///
+ ClientConnected = 0,
+ ///
+ /// Message tag for client disconnect messages
+ ///
+ ClientDisconnected,
+ ///
+ /// Message tag for Pong messages
+ ///
+ Pong,
+ ///
+ /// Message tag for Ping messages
+ ///
+ Ping,
+ ///
+ /// Message tag for unknown client messages
+ ///
+ UnknownClient,
+
+ ///
+ /// Reserved unused tag
+ ///
+ Unused = 200,
+ }
+}
diff --git a/FluffyVoid.Networking/Udp/HeartBeat.cs b/FluffyVoid.Networking/Udp/HeartBeat.cs
new file mode 100644
index 0000000..1024835
--- /dev/null
+++ b/FluffyVoid.Networking/Udp/HeartBeat.cs
@@ -0,0 +1,77 @@
+namespace FluffyVoid.Networking.Udp
+{
+ ///
+ /// Class used to track and manage a heartbeat with another client/server
+ ///
+ public class HeartBeat
+ {
+ ///
+ /// Amount of time that has currently elapsed in the current window
+ ///
+ private float _elapsed;
+ ///
+ /// Whether the heartbeat is currently in the Ping or the Pong window
+ ///
+ private bool _isPingWindowOpen;
+ ///
+ /// Amount of time the ping window will stay open
+ ///
+ private readonly float _pingWindow;
+ ///
+ /// Amount of time the pong window will stay open
+ ///
+ private readonly float _pongWindow;
+ ///
+ /// Event to notify that the window for waiting on a Ping message has closed
+ ///
+ public event Func? PingWindowEnded;
+ ///
+ /// Event to notify that the window for waiting on a Pong message has closed
+ ///
+ public event Func? PongWindowEnded;
+
+ ///
+ /// Constructor used to initialize the Ping and Pong windows
+ ///
+ /// Amount of time the pong window will stay open
+ /// Amount of time the ping window will stay open
+ public HeartBeat(float pongInterval, float pingInterval)
+ {
+ _elapsed = _pongWindow = pongInterval;
+ _pingWindow = pingInterval;
+ _isPingWindowOpen = false;
+ }
+
+ ///
+ /// Update method that calculates whether a window has changed or ended
+ ///
+ /// The amount of time since the last update call
+ public async Task Update(float dt)
+ {
+ _elapsed -= dt;
+ if (_elapsed > 0.0f)
+ {
+ return;
+ }
+
+ if (!_isPingWindowOpen)
+ {
+ _isPingWindowOpen = true;
+ _elapsed = _pingWindow;
+ if (PongWindowEnded != null)
+ {
+ await PongWindowEnded.Invoke();
+ }
+ }
+ else
+ {
+ _isPingWindowOpen = false;
+ _elapsed = _pongWindow;
+ if (PingWindowEnded != null)
+ {
+ await PingWindowEnded.Invoke();
+ }
+ }
+ }
+ }
+}
diff --git a/Networking/Udp/INetworkMessage.cs b/FluffyVoid.Networking/Udp/INetworkMessage.cs
similarity index 89%
rename from Networking/Udp/INetworkMessage.cs
rename to FluffyVoid.Networking/Udp/INetworkMessage.cs
index 83ce41b..bd4263b 100644
--- a/Networking/Udp/INetworkMessage.cs
+++ b/FluffyVoid.Networking/Udp/INetworkMessage.cs
@@ -10,6 +10,10 @@ public interface INetworkMessage
///
byte[] Buffer { get; }
///
+ /// ID of the client sending the message
+ ///
+ short Id { get; }
+ ///
/// The number of bytes in the stream buffer
///
int Length { get; }
@@ -17,9 +21,5 @@ public interface INetworkMessage
/// The tag assigned to the message
///
ushort Tag { get; }
- ///
- /// Id of the client sending the message
- ///
- short Id { get; }
}
}
diff --git a/FluffyVoid.Networking/Udp/IUdpSerializable.cs b/FluffyVoid.Networking/Udp/IUdpSerializable.cs
new file mode 100644
index 0000000..793d76b
--- /dev/null
+++ b/FluffyVoid.Networking/Udp/IUdpSerializable.cs
@@ -0,0 +1,20 @@
+namespace FluffyVoid.Networking.Udp
+{
+ ///
+ /// Defines a contract for any class that can be serialized and deserialized to
+ /// an udp network stream
+ ///
+ public interface IUdpSerializable
+ {
+ ///
+ /// Defines functionality for deserializing data from a UDP reader
+ ///
+ /// Event arg containing data needed to read from the UDP stream
+ void Deserialize(UdpDeserializerEventArgs e);
+ ///
+ /// Defines functionality for serializing data to a UDP writer
+ ///
+ /// Event arg containing data needed to write to the UDP stream
+ int Serialize(UdpSerializerEventArgs e);
+ }
+}
diff --git a/Networking/Udp/MessageBufferMode.cs b/FluffyVoid.Networking/Udp/MessageBufferMode.cs
similarity index 92%
rename from Networking/Udp/MessageBufferMode.cs
rename to FluffyVoid.Networking/Udp/MessageBufferMode.cs
index a4dc7d0..eade84e 100644
--- a/Networking/Udp/MessageBufferMode.cs
+++ b/FluffyVoid.Networking/Udp/MessageBufferMode.cs
@@ -12,6 +12,6 @@ public enum MessageBufferMode
///
/// Message buffer that is capable of being written to
///
- Write
+ Write,
}
}
diff --git a/FluffyVoid.Networking/Udp/NetworkMessageDispatcher.cs b/FluffyVoid.Networking/Udp/NetworkMessageDispatcher.cs
new file mode 100644
index 0000000..01b4252
--- /dev/null
+++ b/FluffyVoid.Networking/Udp/NetworkMessageDispatcher.cs
@@ -0,0 +1,151 @@
+namespace FluffyVoid.Networking.Udp
+{
+ ///
+ /// Class used to allow external classes to register to incoming network
+ /// messages with an appropriate callback
+ ///
+ ///
+ /// The type of network message the dispatcher is
+ /// responsible for
+ ///
+ ///
+ /// The type of event args that the dispatcher
+ /// is expecting to work with
+ ///
+ public class NetworkMessageDispatcher
+ where TNetworkMessage : INetworkMessage
+ where TNetworkEventArgs : INetworkMessageEventArgs
+ {
+ ///
+ /// Queue used to store and free up network message handling quicker, items are
+ /// dispatched during an update cycle
+ ///
+ protected Queue DispatchQueue { get; private set; } =
+ new Queue();
+ ///
+ /// Routing table for incoming message traffic to callbacks based on the Tag of
+ /// a message
+ ///
+ protected Dictionary?>
+ MessageRoutingTable { get; private set; } =
+ new Dictionary?>();
+ ///
+ /// Lock object to enforce thread safety
+ ///
+ protected object ThreadLock { get; set; } = new object();
+ ///
+ /// Clears the routing table of all entries
+ ///
+ public void Clear()
+ {
+ lock (ThreadLock)
+ {
+ MessageRoutingTable.Clear();
+ }
+ }
+
+ ///
+ /// Initializes the dispatcher for use
+ ///
+ public void Initialize()
+ {
+ ThreadLock = new object();
+ MessageRoutingTable =
+ new Dictionary?>();
+
+ DispatchQueue = new Queue();
+ }
+ ///
+ /// Prepares an event arg for dispatching according to thread safety rules
+ ///
+ /// The event arg to dispatch
+ public void PrepareForDispatch(TNetworkEventArgs e)
+ {
+ lock (ThreadLock)
+ {
+ DispatchQueue.Enqueue(e);
+ }
+ }
+ ///
+ /// Registers a callback to a desired message tag id
+ ///
+ /// The message tag id to register to
+ ///
+ /// The callback to use when a message with the desired tag is
+ /// received
+ ///
+ public void RegisterMessageDestination(ushort destination,
+ Action route)
+ {
+ lock (ThreadLock)
+ {
+ MessageRoutingTable.TryAdd(destination, null);
+ MessageRoutingTable[destination] += route;
+ }
+ }
+ ///
+ /// Removes a registered callback from the routing table
+ ///
+ /// The message tag id to remove from
+ /// The callback to remove
+ public void RemoveMessageDestination(ushort destination,
+ Action route)
+ {
+ lock (ThreadLock)
+ {
+ if (MessageRoutingTable.ContainsKey(destination))
+ {
+ MessageRoutingTable[destination] -= route;
+ }
+ }
+ }
+ ///
+ /// Removes an entire tag entry from the routing table
+ ///
+ /// The message tag id to remove from the routing table
+ public void RemoveMessageDestination(ushort destination)
+ {
+ lock (ThreadLock)
+ {
+ if (MessageRoutingTable.ContainsKey(destination))
+ {
+ MessageRoutingTable[destination] = null;
+ }
+
+ MessageRoutingTable.Remove(destination);
+ }
+ }
+ ///
+ /// Checks for any queued message events to dispatch, dispatching 1 per cycle
+ /// if any exist
+ ///
+ public virtual void Update()
+ {
+ lock (ThreadLock)
+ {
+ if (!DispatchQueue.Any())
+ {
+ return;
+ }
+
+ TNetworkEventArgs currentDispatch = DispatchQueue.Dequeue();
+ Dispatch(currentDispatch);
+ }
+ }
+ ///
+ /// Helper function used to check for and fire callbacks for the incoming
+ /// message event arg
+ ///
+ /// The event arg to dispatch out to all registered callbacks
+ protected virtual void Dispatch(TNetworkEventArgs e)
+ {
+ if (!MessageRoutingTable.ContainsKey(e.Tag) ||
+ MessageRoutingTable[e.Tag] == null)
+ {
+ return;
+ }
+
+ MessageRoutingTable[e.Tag]?.Invoke(e);
+ }
+ }
+}
diff --git a/FluffyVoid.Networking/Udp/NetworkUdpClient.cs b/FluffyVoid.Networking/Udp/NetworkUdpClient.cs
new file mode 100644
index 0000000..621a10d
--- /dev/null
+++ b/FluffyVoid.Networking/Udp/NetworkUdpClient.cs
@@ -0,0 +1,343 @@
+using System.Net;
+using System.Net.Sockets;
+using FluffyVoid.Logging;
+using FluffyVoid.Utilities;
+
+namespace FluffyVoid.Networking.Udp
+{
+ ///
+ /// Client class used to communicate via UDP
+ ///
+ public class NetworkUdpClient : IDisposable
+ {
+ ///
+ /// Cancellation token to use when shutting down the client
+ ///
+ private CancellationTokenSource? _cancelTokenSource;
+
+ ///
+ /// The UDPClient to use for network communication
+ ///
+ private UdpClient? _client;
+
+ ///
+ /// ID that has been assigned to the client by the server
+ ///
+ public short Id { get; private set; }
+ ///
+ /// Whether the client is currently connected or not
+ ///
+ public bool IsConnected { get; private set; }
+ ///
+ /// Whether the server is currently listening for network traffic or not
+ ///
+ public bool IsListening { get; private set; }
+ ///
+ /// The name of the client
+ ///
+ public string Name { get; }
+ ///
+ /// Event raised when the client has connected to the server
+ ///
+ public event EventHandler? Connected;
+ ///
+ /// Event raised when the client has disconnected from the server
+ ///
+ public event EventHandler? Disconnected;
+ ///
+ /// Event raised when the client has received a message from the server
+ ///
+ public event EventHandler? MessageReceived;
+ ///
+ /// Event raised when the client has received a message from the server that it
+ /// is not currently registered
+ ///
+ public event EventHandler? ServerUnregistered;
+
+ ///
+ /// Constructor used to create a new UDP client
+ ///
+ public NetworkUdpClient(string name)
+ {
+ Id = -1;
+ Name = name;
+ }
+ ///
+ /// Connects to a server by host name
+ ///
+ ///
+ /// The host name to connect to, E.G.
+ /// www.ashiryn.servequake.com
+ ///
+ /// The port to connect to
+ public void Connect(string hostName, int port)
+ {
+ _client = new UdpClient();
+ _cancelTokenSource = new CancellationTokenSource();
+ _client.Connect(hostName, port);
+ IsConnected = true;
+ }
+ ///
+ /// Connects to a server by ip address
+ ///
+ /// The ip string address to connect to, E.G 192.168.1.1
+ /// The port to connect to
+ public void ConnectViaIp(string ipAddress, int port)
+ {
+ _client = new UdpClient();
+ _cancelTokenSource = new CancellationTokenSource();
+ if (IPAddress.TryParse(ipAddress, out IPAddress? connectAddress))
+ {
+ IPEndPoint endpoint = new IPEndPoint(connectAddress, port);
+ _client.Connect(endpoint);
+ IsConnected = true;
+ }
+ }
+ ///
+ /// Disconnects the client from the server
+ ///
+ public void Disconnect()
+ {
+ if (!IsConnected)
+ {
+ return;
+ }
+
+ ClientConnectionInformation info =
+ new ClientConnectionInformation(Name, Id, true);
+
+ Disconnected?.Invoke(this,
+ new ClientDisconnectedEventArgs(true, info));
+
+ UdpMessage connectMessage =
+ new UdpMessage(GlobalUdpMessageTag.ClientDisconnected);
+
+ UdpWriter writer = connectMessage.GetWriter();
+ writer.Write(info);
+ Send(connectMessage);
+ _cancelTokenSource?.Cancel();
+ Dispose();
+ }
+ ///
+ /// Disconnects the client from the server asynchronously
+ ///
+ public async Task DisconnectAsync()
+ {
+ if (!IsConnected)
+ {
+ return;
+ }
+
+ ClientConnectionInformation info =
+ new ClientConnectionInformation(Name, Id, true);
+
+ UdpMessage connectMessage =
+ new UdpMessage(GlobalUdpMessageTag.ClientDisconnected);
+
+ UdpWriter writer = connectMessage.GetWriter();
+ writer.Write(info);
+ await SendAsync(connectMessage);
+ if (_cancelTokenSource != null)
+ {
+ _cancelTokenSource.Cancel();
+ }
+
+ Dispose();
+ }
+
+ ///
+ /// Closes the client and releases all resources
+ ///
+ public void Dispose()
+ {
+ IsConnected = false;
+ _cancelTokenSource?.Dispose();
+ _client?.Dispose();
+ }
+ ///
+ /// Listen loop used to allow the client to listen for network traffic without
+ /// blocking the main thread
+ ///
+ public async Task ListenAsync()
+ {
+ if (_client == null || _cancelTokenSource == null)
+ {
+ LogManager
+ .LogError("Unable to start listening for network traffic. Client is not properly connected.",
+ nameof(NetworkUdpClient));
+
+ return;
+ }
+
+ do
+ {
+ IsListening = true;
+ try
+ {
+ UdpReceiveResult udpResult =
+ await
+ Task.Run(() => _client.ReceiveAsync().WithCancellation(_cancelTokenSource.Token),
+ _cancelTokenSource.Token);
+
+ if (_cancelTokenSource.Token.IsCancellationRequested)
+ {
+ IsListening = false;
+ return;
+ }
+
+ await ProcessMessage(new UdpMessage(udpResult));
+ }
+ catch (ObjectDisposedException)
+ {
+ IsListening = false;
+ LogManager.Log("Client shutting down->Client Disposed",
+ nameof(NetworkUdpClient));
+ }
+ catch (TaskCanceledException)
+ {
+ IsListening = false;
+ LogManager.Log("Client shutting down->Task Cancelled",
+ nameof(NetworkUdpClient));
+ }
+ catch (Exception ex)
+ {
+ IsListening = false;
+ LogManager
+ .LogException("Client threw an exception while listening",
+ nameof(NetworkUdpClient), ex: ex);
+ }
+ } while (IsListening);
+ }
+ ///
+ /// Sends a message to the server
+ ///
+ /// The message to send to the server
+ /// The number of bytes sent out
+ public int Send(UdpMessage message)
+ {
+ if (!IsConnected || _client == null)
+ {
+ return -1;
+ }
+
+ message.GetWriter().WriteRaw(BitConverter.GetBytes(Id), 0);
+ return _client.Send(message.Buffer, message.Length);
+ }
+ ///
+ /// Sends a message to the server
+ ///
+ /// The message to send to the server
+ /// The number of bytes sent out
+ public async Task SendAsync(UdpMessage message)
+ {
+ if (!IsConnected || _client == null)
+ {
+ return -1;
+ }
+
+ message.GetWriter().WriteRaw(BitConverter.GetBytes(Id), 0);
+ return await _client.SendAsync(message.Buffer, message.Length);
+ }
+ ///
+ /// Sends a connection message to the server with the currently registered name
+ /// of the client
+ ///
+ /// The number of bytes sent out
+ public int SendConnectionInformation()
+ {
+ ClientConnectionInformation info =
+ new ClientConnectionInformation(Name);
+
+ UdpMessage connectMessage =
+ new UdpMessage(GlobalUdpMessageTag.ClientConnected);
+
+ UdpWriter writer = connectMessage.GetWriter();
+ writer.Write(info);
+ return Send(connectMessage);
+ }
+ ///
+ /// Sends a connection message to the server with the currently registered name
+ /// of the client
+ ///
+ /// The number of bytes sent out
+ public async Task SendConnectionInformationAsync()
+ {
+ ClientConnectionInformation info =
+ new ClientConnectionInformation(Name);
+
+ UdpMessage connectMessage =
+ new UdpMessage(GlobalUdpMessageTag.ClientConnected);
+
+ UdpWriter writer = connectMessage.GetWriter();
+ writer.Write(info);
+ return await SendAsync(connectMessage);
+ }
+
+ ///
+ /// Helper function used to process the incoming udp message
+ ///
+ /// The incoming udp message to process
+ private async Task ProcessMessage(UdpMessage message)
+ {
+ UdpReader reader = message.GetReader();
+ switch (message.Tag)
+ {
+ case (ushort)GlobalUdpMessageTag.ClientConnected:
+ {
+ ClientConnectionInformation connectionInfo =
+ reader.Read();
+
+ Id = connectionInfo.Id;
+ IsConnected = true;
+ Connected?.Invoke(this,
+ new
+ ClientConnectedEventArgs(connectionInfo));
+
+ LogManager
+ .LogInfo($"{connectionInfo.Name} registered: {connectionInfo.Successful}",
+ nameof(NetworkUdpClient));
+
+ break;
+ }
+ case (ushort)GlobalUdpMessageTag.ClientDisconnected:
+ {
+ ClientConnectionInformation connectionInfo =
+ reader.Read();
+
+ IsConnected = false;
+ Disconnected?.Invoke(this,
+ new
+ ClientDisconnectedEventArgs(connectionInfo.Successful,
+ connectionInfo));
+
+ LogManager
+ .LogInfo($"{connectionInfo.Name} disconnected from server Locally:{connectionInfo.Successful}",
+ nameof(NetworkUdpClient));
+
+ break;
+ }
+ case (ushort)GlobalUdpMessageTag.Ping:
+ {
+ LogManager
+ .LogVerbose("PING message received from server, replying with PONG message",
+ nameof(NetworkUdpClient));
+
+ await SendAsync(new UdpMessage(GlobalUdpMessageTag.Pong));
+ break;
+ }
+ case (ushort)GlobalUdpMessageTag.UnknownClient:
+ {
+ ServerUnregistered?.Invoke(this, EventArgs.Empty);
+ break;
+ }
+ default:
+ {
+ MessageReceived?.Invoke(this,
+ new UdpMessageEventArgs(message));
+
+ break;
+ }
+ }
+ }
+ }
+}
diff --git a/FluffyVoid.Networking/Udp/NetworkUdpServer.cs b/FluffyVoid.Networking/Udp/NetworkUdpServer.cs
new file mode 100644
index 0000000..caa978d
--- /dev/null
+++ b/FluffyVoid.Networking/Udp/NetworkUdpServer.cs
@@ -0,0 +1,504 @@
+using System.Net;
+using System.Net.Sockets;
+using FluffyVoid.Logging;
+using FluffyVoid.Utilities;
+
+namespace FluffyVoid.Networking.Udp
+{
+ ///
+ /// Server class used to communicate via UDP
+ ///
+ public class NetworkUdpServer : IDisposable
+ {
+ ///
+ /// Cancellation token to use when shutting down the client
+ ///
+ private readonly CancellationTokenSource? _cancelTokenSource;
+ ///
+ /// Starting id to assign to connecting clients
+ ///
+ private short _clientIdCount;
+ ///
+ /// List of clients connected to the server by assigned client id
+ ///
+ private readonly Dictionary _clientList;
+ ///
+ /// Client lookup table linking a name to index within the list of clients
+ ///
+ private readonly Dictionary> _clientLookupTable;
+ ///
+ /// Heartbeat system used to track active clients and ensure stale clients can
+ /// be detected
+ ///
+ private readonly HeartBeat _clientMonitor;
+ ///
+ /// List of clients that have been detected as stale and should be removed
+ ///
+ private readonly List _disconnectionList;
+ ///
+ /// The UdpClient to use for network communication
+ ///
+ private readonly UdpClient _server;
+
+ ///
+ /// Whether the server is currently listening for network traffic or not
+ ///
+ public bool IsListening { get; private set; }
+ ///
+ /// Event raised when a client has connected to the server
+ ///
+ public event EventHandler? ClientConnected;
+ ///
+ /// Event raised when a client has disconnected from the server
+ ///
+ public event EventHandler?
+ ClientDisconnected;
+ ///
+ /// Event raised when the server receives a message from a connected client
+ ///
+ public event EventHandler? MessageReceived;
+
+ ///
+ /// Constructor for the server that binds the server to a desired port
+ ///
+ /// The port the server will bind to and listen on
+ public NetworkUdpServer(int port)
+ {
+ _server = new UdpClient();
+ _cancelTokenSource = new CancellationTokenSource();
+ _clientMonitor = new HeartBeat(600, 10);
+ _clientMonitor.PongWindowEnded += ClientMonitorOnPongWindowEnded;
+ _clientMonitor.PingWindowEnded += ClientMonitorOnPingWindowEnded;
+ _disconnectionList = new List();
+ _clientList = new Dictionary();
+ _clientLookupTable = new Dictionary>();
+ _server.ExclusiveAddressUse = false;
+ _server.Client.SetSocketOption(SocketOptionLevel.Socket,
+ SocketOptionName.ReuseAddress, true);
+
+ _server.Client.Bind(new IPEndPoint(IPAddress.Any, port));
+ }
+ ///
+ /// Constructor for the server that binds the server to a desired port and
+ /// allows for a custom heartbeat interval
+ ///
+ /// The port the server will bind to and listen on
+ ///
+ /// The amount of time to wait before sending PONG
+ /// messages
+ ///
+ ///
+ /// The amount of time to wait before disconnecting clients who haven't
+ /// responded with a PING
+ /// messages
+ ///
+ public NetworkUdpServer(int port,
+ float pongInterval,
+ float pingInterval)
+ {
+ _server = new UdpClient();
+ _cancelTokenSource = new CancellationTokenSource();
+ _clientMonitor = new HeartBeat(pongInterval, pingInterval);
+ _clientMonitor.PongWindowEnded += ClientMonitorOnPongWindowEnded;
+ _clientMonitor.PingWindowEnded += ClientMonitorOnPingWindowEnded;
+ _disconnectionList = new List();
+ _clientList = new Dictionary();
+ _clientLookupTable = new Dictionary>();
+ _server.ExclusiveAddressUse = false;
+ _server.Client.SetSocketOption(SocketOptionLevel.Socket,
+ SocketOptionName.ReuseAddress, true);
+
+ _server.Client.Bind(new IPEndPoint(IPAddress.Any, port));
+ }
+
+ ///
+ /// Closes the server and releases all resources
+ ///
+ public virtual void Dispose()
+ {
+ _cancelTokenSource?.Dispose();
+ _server.Dispose();
+ }
+ ///
+ /// Listen loop used to allow the server to listen for network traffic without
+ /// blocking the main thread
+ ///
+ public virtual async Task ListenAsync()
+ {
+ if (_cancelTokenSource == null)
+ {
+ return;
+ }
+
+ IsListening = true;
+ do
+ {
+ try
+ {
+ UdpReceiveResult udpResult =
+ await
+ Task.Run(() => _server.ReceiveAsync().WithCancellation(_cancelTokenSource.Token),
+ _cancelTokenSource.Token);
+
+ if (_cancelTokenSource.Token.IsCancellationRequested)
+ {
+ IsListening = false;
+ return;
+ }
+
+ await ProcessMessage(new UdpMessage(udpResult), udpResult);
+ }
+ catch (ObjectDisposedException)
+ {
+ IsListening = false;
+ LogManager.Log("Server shutting down->Server Disposed",
+ nameof(NetworkUdpServer));
+ }
+ catch (TaskCanceledException)
+ {
+ IsListening = false;
+ LogManager.Log("Server shutting down->Task Cancelled",
+ nameof(NetworkUdpServer));
+ }
+ catch (Exception ex)
+ {
+ LogManager
+ .LogException("Server threw an exception while listening",
+ nameof(NetworkUdpServer), ex: ex);
+ }
+ } while (IsListening);
+ }
+ ///
+ /// Sends a message to all connected clients
+ ///
+ /// The message to send to the client
+ public async Task SendAllAsync(UdpMessage message)
+ {
+ List sendTasks = new List();
+ foreach (ClientInformation currentClient in _clientList.Values)
+ {
+ sendTasks.Add(_server.SendAsync(message.Buffer, message.Length,
+ currentClient.Endpoint));
+ }
+
+ await Task.WhenAll(sendTasks.ToArray());
+ }
+ ///
+ /// Sends a message to the desired client by its id
+ ///
+ /// The client id to send the message to
+ /// The message to send to the client
+ /// The number of bytes sent out
+ public async Task SendAsync(short clientId, UdpMessage message)
+ {
+ if (_clientList.TryGetValue(clientId,
+ out ClientInformation? client))
+ {
+ return await _server.SendAsync(message.Buffer, message.Length,
+ client.Endpoint);
+ }
+
+ return -1;
+ }
+ ///
+ /// Sends a message to the desired clients by name
+ ///
+ /// The name of the clients to send messages to
+ /// The message to send to the client
+ public async Task SendAsync(string clientName, UdpMessage message)
+ {
+ if (!_clientLookupTable.ContainsKey(clientName))
+ {
+ return;
+ }
+
+ List sendTasks = new List();
+ foreach (int id in _clientLookupTable[clientName])
+ {
+ if (_clientList.TryGetValue(id, out ClientInformation? client))
+ {
+ sendTasks.Add(_server.SendAsync(message.Buffer,
+ message.Length,
+ client.Endpoint));
+ }
+ }
+
+ await Task.WhenAll(sendTasks.ToArray());
+ }
+ ///
+ /// Sends a message to all connected clients except for the desired client
+ ///
+ /// The client id to send the message to
+ /// The message to send to the client
+ public async Task SendOthersAsync(short clientId, UdpMessage message)
+ {
+ List sendTasks = new List();
+ foreach (ClientInformation currentClient in _clientList.Values)
+ {
+ if (currentClient.Id == clientId)
+ {
+ return;
+ }
+
+ sendTasks.Add(_server.SendAsync(message.Buffer, message.Length,
+ currentClient.Endpoint));
+ }
+
+ await Task.WhenAll(sendTasks.ToArray());
+ }
+ ///
+ /// Sends a message to all connected clients except for the desired client
+ ///
+ /// The name of the clients to send messages to
+ /// The message to send to the client
+ public async Task SendOthersAsync(string clientName, UdpMessage message)
+ {
+ List sendTasks = new List();
+ foreach (ClientInformation currentClient in _clientList.Values)
+ {
+ if (currentClient.Name == clientName)
+ {
+ continue;
+ }
+
+ sendTasks.Add(_server.SendAsync(message.Buffer, message.Length,
+ currentClient.Endpoint));
+ }
+
+ await Task.WhenAll(sendTasks.ToArray());
+ }
+ ///
+ /// Attempts to gracefully shut the server down
+ ///
+ public void Shutdown()
+ {
+ _cancelTokenSource?.Cancel();
+ Dispose();
+ }
+ ///
+ /// Update loop to allow certain systems to be run on a normalized update loop
+ ///
+ /// The amount of time since the last update call
+ public virtual async Task Update(float dt)
+ {
+ await _clientMonitor.Update(dt);
+ }
+
+ ///
+ /// Sends a message to an unregistered client by its id
+ ///
+ /// The client endpoint to send the message to
+ /// The message to send to the client
+ /// The number of bytes sent out
+ protected async Task SendToUnknownClientAsync(
+ IPEndPoint clientEndpoint,
+ UdpMessage message)
+ {
+ return await _server.SendAsync(message.Buffer, message.Length,
+ clientEndpoint);
+ }
+ ///
+ /// Handles properly disconnecting any stale client connections that did not
+ /// respond within the Ping window
+ ///
+ private async Task ClientMonitorOnPingWindowEnded()
+ {
+ _disconnectionList.Clear();
+ foreach (KeyValuePair client in _clientList)
+ {
+ if (client.Value.IsAlive)
+ {
+ continue;
+ }
+
+ UdpMessage toSend =
+ new UdpMessage(GlobalUdpMessageTag.ClientDisconnected);
+
+ ClientConnectionInformation info =
+ new ClientConnectionInformation(client.Value.Name,
+ client.Value.Id, false);
+
+ UdpWriter writer = toSend.GetWriter();
+ writer.Write(info);
+ _disconnectionList.Add(info);
+ await SendAsync(client.Value.Id, toSend);
+ }
+
+ foreach (ClientConnectionInformation client in _disconnectionList)
+ {
+ DisconnectClient(client);
+ }
+ }
+ ///
+ /// Handles properly sending PING messages out to all connected clients
+ ///
+ private async Task ClientMonitorOnPongWindowEnded()
+ {
+ foreach (KeyValuePair client in _clientList)
+ {
+ UdpMessage toSend = new UdpMessage(GlobalUdpMessageTag.Ping);
+ client.Value.IsAlive = false;
+ LogManager
+ .LogVerbose($"Sending PING message to client: {client.Value.Name}",
+ nameof(NetworkUdpServer));
+
+ await SendAsync(client.Value.Id, toSend);
+ }
+ }
+ ///
+ /// Helper function used to remove a client entry from the corresponding lookup
+ /// tables
+ ///
+ ///
+ /// The client connection information to use for removal of the
+ /// client
+ ///
+ private void DisconnectClient(ClientConnectionInformation info)
+ {
+ if (_clientList.ContainsKey(info.Id) &&
+ _clientLookupTable.ContainsKey(_clientList[info.Id].Name))
+ {
+ _clientLookupTable[_clientList[info.Id].Name].Remove(info.Id);
+ }
+
+ _clientList.Remove(info.Id);
+ ClientDisconnected?.Invoke(this,
+ new
+ ClientDisconnectedEventArgs(info.Successful,
+ info));
+
+ LogManager.LogInfo($"{info.Name} disconnected from server",
+ nameof(NetworkUdpServer));
+ }
+ ///
+ /// Helper function used to register a connecting client with the server
+ ///
+ ///
+ /// The client id that is connecting to determine if the
+ /// client is a dropped client, or a new client
+ ///
+ /// The endpoint for the client
+ /// The connection information for the connecting client
+ private async Task ProcessConnectionMessage(short clientId,
+ IPEndPoint clientEndpoint,
+ ClientConnectionInformation
+ connectInfo)
+ {
+ short currentId = _clientIdCount++;
+ if (_clientList.ContainsKey(clientId))
+ {
+ if (_clientLookupTable.ContainsKey(_clientList[clientId].Name))
+ {
+ _clientLookupTable[_clientList[clientId].Name]
+ .Remove(clientId);
+ }
+
+ _clientList.Remove(clientId);
+ }
+
+ _clientList[currentId] =
+ new ClientInformation(currentId, connectInfo.Name,
+ clientEndpoint);
+
+ if (!_clientLookupTable.ContainsKey(connectInfo.Name))
+ {
+ _clientLookupTable[connectInfo.Name] = new List();
+ }
+
+ _clientLookupTable[connectInfo.Name].Add(currentId);
+ LogManager
+ .Log($"{connectInfo.Name} just connected at {clientEndpoint}",
+ nameof(NetworkUdpServer));
+
+ UdpMessage connectedAck =
+ new UdpMessage(GlobalUdpMessageTag.ClientConnected);
+
+ ClientConnectionInformation clientAckInfo =
+ new ClientConnectionInformation(connectInfo.Name, currentId,
+ true);
+
+ connectedAck.GetWriter().Write(clientAckInfo);
+ await SendAsync(currentId, connectedAck);
+ }
+
+ ///
+ /// Helper function used to process the incoming udp message
+ ///
+ /// The incoming udp message to process
+ /// The incoming udp result to aid in processing
+ private async Task ProcessMessage(UdpMessage message,
+ UdpReceiveResult incomingMessage)
+ {
+ UdpReader reader = message.GetReader();
+ switch (message.Tag)
+ {
+ case (ushort)GlobalUdpMessageTag.ClientConnected:
+ {
+ ClientConnectionInformation connectionInfo =
+ reader.Read();
+
+ ClientConnected?.Invoke(this,
+ new
+ ClientConnectedEventArgs(connectionInfo));
+
+ await ProcessConnectionMessage(message.Id,
+ incomingMessage
+ .RemoteEndPoint,
+ connectionInfo);
+
+ break;
+ }
+ case (ushort)GlobalUdpMessageTag.ClientDisconnected:
+ {
+ ClientConnectionInformation connectionInfo =
+ reader.Read();
+
+ DisconnectClient(connectionInfo);
+ break;
+ }
+ case (ushort)GlobalUdpMessageTag.Pong:
+ if (_clientList.TryGetValue(message.Id,
+ out ClientInformation? client))
+ {
+ LogManager
+ .LogVerbose($"Received PONG from client: {message.Id}",
+ nameof(NetworkUdpServer));
+
+ client.IsAlive = true;
+ }
+ else
+ {
+ await
+ SendToUnknownClientAsync(incomingMessage.RemoteEndPoint,
+ new
+ UdpMessage(GlobalUdpMessageTag
+ .UnknownClient));
+ }
+
+ break;
+ default:
+ {
+ if (!_clientList.ContainsKey(message.Id))
+ {
+ await
+ SendToUnknownClientAsync(incomingMessage.RemoteEndPoint,
+ new
+ UdpMessage(GlobalUdpMessageTag
+ .UnknownClient));
+
+ LogManager
+ .LogError("Message from unknown client received, discarding message...",
+ nameof(NetworkUdpServer));
+ }
+ else
+ {
+ MessageReceived?.Invoke(this,
+ new UdpMessageEventArgs(message));
+ }
+
+ break;
+ }
+ }
+ }
+ }
+}
diff --git a/FluffyVoid.Networking/Udp/UdpMessage.cs b/FluffyVoid.Networking/Udp/UdpMessage.cs
new file mode 100644
index 0000000..34a61d6
--- /dev/null
+++ b/FluffyVoid.Networking/Udp/UdpMessage.cs
@@ -0,0 +1,118 @@
+using System.Net.Sockets;
+using FluffyVoid.Utilities;
+
+namespace FluffyVoid.Networking.Udp
+{
+ ///
+ /// Utility class used to read and write an udp network stream to a dev
+ /// friendly
+ /// packet
+ ///
+ public class UdpMessage : INetworkMessage
+ {
+ ///
+ /// The buffer mode to assign to the message, helps to prevent trying to read
+ /// from a write buffer and vice versa
+ ///
+ private readonly MessageBufferMode _bufferMode;
+ ///
+ /// The udp stream created for this buffer based on the buffer mode
+ ///
+ private readonly UdpStream _stream;
+
+ ///
+ /// Reference to the streams byte buffer
+ ///
+ public byte[] Buffer => _stream.Buffer;
+
+ ///
+ /// Size of the network buffer
+ ///
+ public static ushort BufferSize { get; set; } = 512;
+ ///
+ /// ID of the client sending the message
+ ///
+ public short Id { get; }
+ ///
+ /// The number of bytes in the stream buffer
+ ///
+ public int Length => _stream.Length;
+ ///
+ /// The tag assigned to the message
+ ///
+ public ushort Tag { get; }
+
+ ///
+ /// Constructor used to builds a message for use in writing to the network
+ /// stream
+ ///
+ /// The tag to assign to the message
+ public UdpMessage(ushort tag)
+ {
+ Tag = tag;
+ _stream = new UdpWriter(BufferSize);
+ _bufferMode = MessageBufferMode.Write;
+ GetWriter().WriteShort(Id);
+ GetWriter().WriteUshort(Tag);
+ }
+ ///
+ /// Constructor used to builds a message for use in writing to the network
+ /// stream
+ ///
+ /// The tag to assign to the message
+ public UdpMessage(Enum tag)
+ {
+ Tag = tag.ToUshort();
+ _stream = new UdpWriter(BufferSize);
+ _bufferMode = MessageBufferMode.Write;
+ GetWriter().WriteShort(Id);
+ GetWriter().WriteUshort(Tag);
+ }
+ ///
+ /// Constructor used to build a message for reading from the network stream
+ ///
+ /// Reference to the udp result
+ public UdpMessage(UdpReceiveResult udpStream)
+ {
+ _stream = new UdpReader(udpStream.Buffer, udpStream.Buffer.Length);
+ _bufferMode = MessageBufferMode.Read;
+ Id = GetReader().ReadShort();
+ Tag = GetReader().ReadUshort();
+ }
+
+ ///
+ /// Returns the reader assigned to this message for use in reading variables
+ /// from the network stream
+ ///
+ ///
+ /// The assigned reader if the message is in Read mode, otherwise an empty
+ /// reader
+ ///
+ public UdpReader GetReader()
+ {
+ if (_stream is UdpReader reader)
+ {
+ return reader;
+ }
+
+ return new UdpReader(_bufferMode);
+ }
+ ///
+ /// Returns the writer assigned to this message for use in writing variables to
+ /// the network stream
+ ///
+ ///
+ /// The assigned writer if the message is in Write mode, otherwise an
+ /// empty writer
+ ///
+ public UdpWriter GetWriter()
+ {
+ if (_stream is UdpWriter writer)
+ {
+ return writer;
+ }
+
+ return new UdpWriter(_bufferMode);
+ }
+ }
+}
diff --git a/FluffyVoid.Networking/Udp/UdpReader.cs b/FluffyVoid.Networking/Udp/UdpReader.cs
new file mode 100644
index 0000000..1f518e1
--- /dev/null
+++ b/FluffyVoid.Networking/Udp/UdpReader.cs
@@ -0,0 +1,295 @@
+using System.Text;
+using FluffyVoid.Logging;
+
+namespace FluffyVoid.Networking.Udp
+{
+ ///
+ /// Udp reader class used to read values directly from a network byte stream
+ ///
+ public class UdpReader : UdpStream
+ {
+ ///
+ /// Default constructor for initializing the udp reader
+ ///
+ /// The buffer to be read by the reader
+ /// The length of the buffer
+ public UdpReader(byte[] buffer, int bufferLength)
+ {
+ Position = 0;
+ Length = bufferLength;
+ Buffer = buffer;
+ BufferMode = MessageBufferMode.Read;
+ }
+ ///
+ /// Constructor used to initialize an empty reader
+ ///
+ /// The buffer mode of the udp message
+ public UdpReader(MessageBufferMode bufferMode = MessageBufferMode.Read)
+ {
+ Position = Length = 0;
+ Buffer =
+ [];
+
+ BufferMode = bufferMode;
+ }
+ ///
+ /// Reads a custom serializable class from the network stream
+ ///
+ public T Read()
+ where T : IUdpSerializable
+ {
+ T value = Activator.CreateInstance();
+ value.Deserialize(new UdpDeserializerEventArgs(this));
+ return value;
+ }
+ ///
+ /// Reads a single bool from the network stream
+ ///
+ /// The bool value from the network stream if successful, otherwise false
+ public bool ReadBool()
+ {
+ if (ReadFromBuffer(out byte[] itemBuffer, sizeof(bool)) > 0)
+ {
+ return BitConverter.ToBoolean(itemBuffer.ToArray(), 0);
+ }
+
+ LogManager.LogError("Unable to read Bool from the buffer",
+ nameof(UdpReader));
+
+ return false;
+ }
+
+ ///
+ /// Reads a single byte from the network stream
+ ///
+ /// The byte value from the network stream if successful, otherwise 0
+ public byte ReadByte()
+ {
+ if (ReadFromBuffer(out byte[] itemBuffer, sizeof(byte)) > 0)
+ {
+ return itemBuffer.ToArray()[0];
+ }
+
+ LogManager.LogError("Unable to read Byte from the buffer",
+ nameof(UdpReader));
+
+ return 0;
+ }
+ ///
+ /// Reads a single char from the network stream
+ ///
+ /// The char value from the network stream if successful, otherwise 'a'
+ public char ReadChar()
+ {
+ if (ReadFromBuffer(out byte[] itemBuffer, sizeof(char)) > 0)
+ {
+ return BitConverter.ToChar(itemBuffer.ToArray(), 0);
+ }
+
+ LogManager.LogError("Unable to read Char from the buffer",
+ nameof(UdpReader));
+
+ return 'a';
+ }
+ ///
+ /// Reads a single double from the network stream
+ ///
+ /// The double value from the network stream if successful, otherwise 0
+ public double ReadDouble()
+ {
+ if (ReadFromBuffer(out byte[] itemBuffer, sizeof(double)) > 0)
+ {
+ return BitConverter.ToDouble(itemBuffer.ToArray(), 0);
+ }
+
+ LogManager.LogError("Unable to read Double from the buffer",
+ nameof(UdpReader));
+
+ return 0;
+ }
+ ///
+ /// Reads a single float from the network stream
+ ///
+ /// The float value from the network stream if successful, otherwise 0
+ public float ReadFloat()
+ {
+ if (ReadFromBuffer(out byte[] itemBuffer, sizeof(float)) > 0)
+ {
+ return BitConverter.ToSingle(itemBuffer.ToArray(), 0);
+ }
+
+ LogManager.LogError("Unable to read Float from the buffer",
+ nameof(UdpReader));
+
+ return 0;
+ }
+ ///
+ /// Reads a single int from the network stream
+ ///
+ /// The int value from the network stream if successful, otherwise 0
+ public int ReadInt()
+ {
+ if (ReadFromBuffer(out byte[] itemBuffer, sizeof(int)) > 0)
+ {
+ return BitConverter.ToInt32(itemBuffer.ToArray(), 0);
+ }
+
+ LogManager.LogError("Unable to read Int from the buffer",
+ nameof(UdpReader));
+
+ return 0;
+ }
+ ///
+ /// Reads a custom serializable class from the network stream
+ ///
+ /// The class to read
+ public void ReadInto(ref T? value)
+ where T : IUdpSerializable
+ {
+ value ??= Read();
+ value.Deserialize(new UdpDeserializerEventArgs(this));
+ }
+ ///
+ /// Reads a single long from the network stream
+ ///
+ /// The long value from the network stream if successful, otherwise 0
+ public long ReadLong()
+ {
+ if (ReadFromBuffer(out byte[] itemBuffer, sizeof(long)) > 0)
+ {
+ return BitConverter.ToInt64(itemBuffer.ToArray(), 0);
+ }
+
+ LogManager.LogError("Unable to read Long from the buffer",
+ nameof(UdpReader));
+
+ return 0;
+ }
+ ///
+ /// Reads a single short from the network stream
+ ///
+ /// The short value from the network stream if successful, otherwise 0
+ public short ReadShort()
+ {
+ if (ReadFromBuffer(out byte[] itemBuffer, sizeof(short)) > 0)
+ {
+ return BitConverter.ToInt16(itemBuffer.ToArray(), 0);
+ }
+
+ LogManager.LogError("Unable to read Short from the buffer",
+ nameof(UdpReader));
+
+ return 0;
+ }
+ ///
+ /// Reads a string from the network stream
+ ///
+ /// The string value from the network stream if successful, otherwise ""
+ public string ReadString()
+ {
+ ushort bufferLength = ReadUshort();
+ if (bufferLength <= 0)
+ {
+ return "";
+ }
+
+ if (ReadFromBuffer(out byte[] itemBuffer, bufferLength) > 0)
+ {
+ return Encoding.ASCII.GetString(itemBuffer.ToArray(), 0,
+ bufferLength);
+ }
+
+ return "";
+ }
+ ///
+ /// Reads a single uint from the network stream
+ ///
+ /// The uint value from the network stream if successful, otherwise 0
+ public uint ReadUint()
+ {
+ if (ReadFromBuffer(out byte[] itemBuffer, sizeof(uint)) > 0)
+ {
+ return BitConverter.ToUInt32(itemBuffer.ToArray(), 0);
+ }
+
+ LogManager.LogError("Unable to read Uint from the buffer",
+ nameof(UdpReader));
+
+ return 0;
+ }
+ ///
+ /// Reads a single ulong from the network stream
+ ///
+ /// The ulong value from the network stream if successful, otherwise 0
+ public ulong ReadUlong()
+ {
+ if (ReadFromBuffer(out byte[] itemBuffer, sizeof(ulong)) > 0)
+ {
+ return BitConverter.ToUInt64(itemBuffer.ToArray(), 0);
+ }
+
+ LogManager.LogError("Unable to read Ulong from the buffer",
+ nameof(UdpReader));
+
+ return 0;
+ }
+ ///
+ /// Reads a single ushort from the network stream
+ ///
+ /// The ushort value from the network stream if successful, otherwise 0
+ public ushort ReadUshort()
+ {
+ if (ReadFromBuffer(out byte[] itemBuffer, sizeof(ushort)) > 0)
+ {
+ return BitConverter.ToUInt16(itemBuffer.ToArray(), 0);
+ }
+
+ LogManager.LogError("Unable to read Ushort from the buffer",
+ nameof(UdpReader));
+
+ return 0;
+ }
+
+ ///
+ /// Helper function used to verify the BufferMode has been set to Read, as well
+ /// as reading within the bounds of the
+ /// stream
+ ///
+ /// The byte buffer for the requested variable
+ /// The number of bytes to read from the network buffer
+ /// The number of bytes successfully read from the buffer
+ private int ReadFromBuffer(out byte[] itemBuffer, int readLength)
+ {
+ if (BufferMode != MessageBufferMode.Read)
+ {
+ LogManager
+ .LogError("Attempting to read from a buffer not assigned for reading",
+ nameof(UdpReader));
+
+ itemBuffer =
+ [];
+
+ return -1;
+ }
+
+ if (Position + readLength <= Length)
+ {
+ itemBuffer = BitConverter.IsLittleEndian && readLength > 1
+ ? Buffer.Skip(Position).Take(readLength).Reverse().ToArray()
+ : Buffer.Skip(Position).Take(readLength).ToArray();
+
+ Position += readLength;
+ return readLength;
+ }
+
+ LogManager
+ .LogError($"Attempting to read {Position + readLength - Length} bytes past the end of the message buffer",
+ nameof(UdpReader));
+
+ itemBuffer =
+ [];
+
+ return -1;
+ }
+ }
+}
diff --git a/FluffyVoid.Networking/Udp/UdpWriter.cs b/FluffyVoid.Networking/Udp/UdpWriter.cs
new file mode 100644
index 0000000..6859943
--- /dev/null
+++ b/FluffyVoid.Networking/Udp/UdpWriter.cs
@@ -0,0 +1,235 @@
+using System.Text;
+using FluffyVoid.Logging;
+
+namespace FluffyVoid.Networking.Udp
+{
+ ///
+ /// Udp writer class used to read values directly from a network byte stream
+ ///
+ public class UdpWriter : UdpStream
+ {
+ ///
+ /// Maximum size of the message buffer
+ ///
+ private readonly ushort _maximumMessageBufferSize;
+
+ ///
+ /// Default constructor for initializing the udp writer
+ ///
+ /// The max size of the network stream
+ public UdpWriter(ushort bufferSize)
+ {
+ _maximumMessageBufferSize = bufferSize;
+ Position = Length = 0;
+ Buffer = new byte[_maximumMessageBufferSize];
+ BufferMode = MessageBufferMode.Write;
+ }
+ ///
+ /// Constructor used to initialize an empty writer
+ ///
+ ///
+ public UdpWriter(MessageBufferMode bufferMode = MessageBufferMode.Write)
+ {
+ _maximumMessageBufferSize = 0;
+ Position = Length = 0;
+ Buffer =
+ [];
+
+ BufferMode = bufferMode;
+ }
+ ///
+ /// Writes a custom serializable class to the network stream
+ ///
+ /// The class to write
+ public int Write(T value)
+ where T : IUdpSerializable
+ {
+ return value.Serialize(new UdpSerializerEventArgs(this));
+ }
+ ///
+ /// Writes a single bool to the network stream
+ ///
+ /// The bool value to write
+ public int WriteBool(bool value)
+ {
+ return WriteToBuffer(BitConverter.GetBytes(value));
+ }
+
+ ///
+ /// Writes a single byte to the network stream
+ ///
+ /// The byte value to write
+ public int WriteByte(byte value)
+ {
+ return WriteToBuffer([
+ value,
+ ]);
+ }
+ ///
+ /// Writes a single char to the network stream
+ ///
+ /// The char value to write
+ public int WriteChar(char value)
+ {
+ return WriteToBuffer(BitConverter.GetBytes(value));
+ }
+ ///
+ /// Writes a single double to the network stream
+ ///
+ /// The double value to write
+ public int WriteDouble(double value)
+ {
+ return WriteToBuffer(BitConverter.GetBytes(value));
+ }
+ ///
+ /// Writes a single float to the network stream
+ ///
+ /// The float value to write
+ public int WriteFloat(float value)
+ {
+ return WriteToBuffer(BitConverter.GetBytes(value));
+ }
+ ///
+ /// Writes a single int to the network stream
+ ///
+ /// The int value to write
+ public int WriteInt(int value)
+ {
+ return WriteToBuffer(BitConverter.GetBytes(value));
+ }
+ ///
+ /// Writes a single long to the network stream
+ ///
+ /// The long value to write
+ public int WriteLong(long value)
+ {
+ return WriteToBuffer(BitConverter.GetBytes(value));
+ }
+ ///
+ /// writes a raw byte buffer at the desired location within the stream
+ ///
+ ///
+ /// The byte buffer for the requested variable to be
+ /// written to the stream
+ ///
+ /// The starting position to write the byte buffer
+ /// The number of bytes successfully written to the stream
+ public int WriteRaw(byte[] itemBuffer, int itemPosition)
+ {
+ if (BufferMode != MessageBufferMode.Write)
+ {
+ LogManager
+ .LogError("Attempting to write to a buffer not assigned for writing",
+ nameof(UdpWriter));
+
+ return -1;
+ }
+
+ if (itemPosition + itemBuffer.Length < _maximumMessageBufferSize)
+ {
+ if (BitConverter.IsLittleEndian && itemBuffer.Length > 1)
+ {
+ itemBuffer = itemBuffer.Reverse().ToArray();
+ }
+
+ itemBuffer.CopyTo(Buffer, itemPosition);
+ if (itemPosition + itemBuffer.Length > Length)
+ {
+ Length = itemPosition + itemBuffer.Length;
+ }
+
+ return itemBuffer.Length;
+ }
+
+ LogManager
+ .LogError($"Attempting to write {Length + itemBuffer.Length - _maximumMessageBufferSize} bytes past the end of the buffer",
+ nameof(UdpWriter));
+
+ return -1;
+ }
+ ///
+ /// Writes a single short to the network stream
+ ///
+ /// The short value to write
+ public int WriteShort(short value)
+ {
+ return WriteToBuffer(BitConverter.GetBytes(value));
+ }
+ ///
+ /// Writes a string to the network stream
+ ///
+ /// The string value to write
+ public int WriteString(string value)
+ {
+ int count =
+ WriteToBuffer(BitConverter.GetBytes((ushort)value.Length));
+
+ count += WriteToBuffer(Encoding.ASCII.GetBytes(value));
+ return count;
+ }
+ ///
+ /// Writes a single uint to the network stream
+ ///
+ /// The uint value to write
+ public int WriteUint(uint value)
+ {
+ return WriteToBuffer(BitConverter.GetBytes(value));
+ }
+ ///
+ /// Writes a single ulong to the network stream
+ ///
+ /// The ulong value to write
+ public int WriteUlong(ulong value)
+ {
+ return WriteToBuffer(BitConverter.GetBytes(value));
+ }
+ ///
+ /// Writes a single ushort to the network stream
+ ///
+ /// The ushort value to write
+ public int WriteUshort(ushort value)
+ {
+ return WriteToBuffer(BitConverter.GetBytes(value));
+ }
+
+ ///
+ /// Helper function used to verify the BufferMode has been set to Write, as
+ /// well as writing within the bounds of the
+ /// stream
+ ///
+ ///
+ /// The byte buffer for the requested variable to be
+ /// written to the stream
+ ///
+ /// The number of bytes successfully written to the stream
+ private int WriteToBuffer(byte[] itemBuffer)
+ {
+ if (BufferMode != MessageBufferMode.Write)
+ {
+ LogManager
+ .LogError("Attempting to write to a buffer not assigned for writing",
+ nameof(UdpWriter));
+
+ return -1;
+ }
+
+ if (Length + itemBuffer.Length < _maximumMessageBufferSize)
+ {
+ if (BitConverter.IsLittleEndian && itemBuffer.Length > 1)
+ {
+ itemBuffer = itemBuffer.Reverse().ToArray();
+ }
+
+ itemBuffer.CopyTo(Buffer, Length);
+ Length += itemBuffer.Length;
+ return itemBuffer.Length;
+ }
+
+ LogManager
+ .LogError($"Attempting to write {Length + itemBuffer.Length - _maximumMessageBufferSize} bytes past the end of the buffer",
+ nameof(UdpWriter));
+
+ return -1;
+ }
+ }
+}
diff --git a/FluffyVoid.Networking/Udp/UpdStream.cs b/FluffyVoid.Networking/Udp/UpdStream.cs
new file mode 100644
index 0000000..634c12b
--- /dev/null
+++ b/FluffyVoid.Networking/Udp/UpdStream.cs
@@ -0,0 +1,25 @@
+namespace FluffyVoid.Networking.Udp
+{
+ ///
+ /// Base class for udp streams
+ ///
+ public abstract class UdpStream
+ {
+ ///
+ /// The byte buffer the stream uses to operate on the network stream
+ ///
+ public byte[] Buffer { get; protected set; } = null!;
+ ///
+ /// The length of the byte buffer
+ ///
+ public int Length { get; protected set; }
+ ///
+ /// The buffer mode the stream has been set to
+ ///
+ protected MessageBufferMode BufferMode { get; set; }
+ ///
+ /// The current position of the pointer in the buffer
+ ///
+ protected int Position { get; set; }
+ }
+}
diff --git a/Networking/Web/AuthorizationType.cs b/FluffyVoid.Networking/Web/AuthorizationType.cs
similarity index 84%
rename from Networking/Web/AuthorizationType.cs
rename to FluffyVoid.Networking/Web/AuthorizationType.cs
index a8bda57..4e2ffb1 100644
--- a/Networking/Web/AuthorizationType.cs
+++ b/FluffyVoid.Networking/Web/AuthorizationType.cs
@@ -1,7 +1,8 @@
namespace FluffyVoid.Networking.Web
{
///
- /// Authorization types for use in creating an Authorization Header in HTTP requests
+ /// Authorization types for use in creating an Authorization Header in HTTP
+ /// requests
///
public enum AuthorizationType
{
@@ -12,6 +13,6 @@ public enum AuthorizationType
///
/// Oauth authorization of a Bearer type
///
- Bearer
+ Bearer,
}
}
diff --git a/Networking/Web/ContentType.cs b/FluffyVoid.Networking/Web/ContentType.cs
similarity index 79%
rename from Networking/Web/ContentType.cs
rename to FluffyVoid.Networking/Web/ContentType.cs
index 04a7c1d..54a300a 100644
--- a/Networking/Web/ContentType.cs
+++ b/FluffyVoid.Networking/Web/ContentType.cs
@@ -3,7 +3,7 @@
namespace FluffyVoid.Networking.Web
{
///
- /// Enumeration to determine the content type of a REST api data content
+ /// Enumeration to determine the content type of REST api data content
///
public enum ContentType
{
@@ -16,6 +16,6 @@ public enum ContentType
/// Content that consists of Form data
///
[Description("application/x-www-form-urlencoded")]
- Form
+ Form,
}
}
diff --git a/Networking/Web/IWebInfo.cs b/FluffyVoid.Networking/Web/IWebInfo.cs
similarity index 97%
rename from Networking/Web/IWebInfo.cs
rename to FluffyVoid.Networking/Web/IWebInfo.cs
index c65914c..f943298 100644
--- a/Networking/Web/IWebInfo.cs
+++ b/FluffyVoid.Networking/Web/IWebInfo.cs
@@ -5,6 +5,10 @@
///
public interface IWebInfo
{
+ ///
+ /// Whether the web request should await for the callback to finish
+ ///
+ bool AwaitCallback { get; }
///
/// Any error message that may have occurred while processing the web request
///
@@ -13,10 +17,6 @@ public interface IWebInfo
/// Whether the web request has finished processing
///
bool IsDone { get; }
- ///
- /// Whether the web request should await for the callback to finish
- ///
- bool AwaitCallback { get; }
///
/// Retrieves a formatted error message
diff --git a/FluffyVoid.Networking/Web/WebClient.cs b/FluffyVoid.Networking/Web/WebClient.cs
new file mode 100644
index 0000000..aa80783
--- /dev/null
+++ b/FluffyVoid.Networking/Web/WebClient.cs
@@ -0,0 +1,175 @@
+using System.Net;
+using FluffyVoid.Logging;
+using FluffyVoid.Utilities;
+
+// ReSharper disable ConvertIfStatementToNullCoalescingExpression
+
+namespace FluffyVoid.Networking.Web
+{
+ ///
+ /// Rest capable client that can communicate with an HTTP endpoint
+ ///
+ public class WebClient
+ {
+ ///
+ /// Backoff table that retries a request with exponential delays
+ ///
+ private readonly int[] _retryBackoffTable =
+ [
+ 0, 1000, 2000, 4000,
+ ];
+ ///
+ /// Singleton instance to aid in keeping a single http client no matter how
+ /// many the project tries to create
+ ///
+ private static volatile HttpClient? s_instance;
+
+ ///
+ /// Instance variable for the singleton that ensures the singleton is always
+ /// created
+ ///
+ protected static HttpClient Instance
+ {
+ get
+ {
+ if (s_instance == null)
+ {
+ s_instance = new HttpClient();
+ }
+
+ return s_instance;
+ }
+ }
+ ///
+ /// Event to notify that a request has failed due to not having proper
+ /// authorization
+ ///
+ public event EventHandler? AuthorizationFailed;
+
+ ///
+ /// Downloads a file from the requested URL and saves it at the desired
+ /// filepath location
+ ///
+ /// The URL to download the file from
+ /// The filepath to save the file to locally
+ public async Task DownloadFileAsync(string url, string filePath)
+ {
+ if (string.IsNullOrEmpty(url) || string.IsNullOrEmpty(filePath))
+ {
+ LogManager
+ .LogError($"Unable to download file, URL or FilePath not set\nURL={url}\nFilePath={filePath}",
+ nameof(WebClient));
+
+ return;
+ }
+
+ try
+ {
+ await using Stream urlStream =
+ await Instance.GetStreamAsync(url);
+
+ string? directory = Path.GetDirectoryName(filePath);
+ if (!string.IsNullOrEmpty(directory) &&
+ !Directory.Exists(directory))
+ {
+ Directory.CreateDirectory(directory);
+ }
+
+ await using FileStream writer =
+ new FileStream(filePath, FileMode.OpenOrCreate);
+
+ await urlStream.CopyToAsync(writer);
+ }
+ catch (Exception e)
+ {
+ LogManager.LogException($"Failed to download file from {url}",
+ nameof(WebClient), ex: e);
+ }
+ }
+
+ ///
+ /// Sends a web request to its external HTTP endpoint
+ ///
+ /// The web message data to send out
+ public async Task SendRequestAsync(WebMessage message)
+ {
+ try
+ {
+ using HttpResponseMessage response =
+ await Instance.SendAsync(message.Request);
+
+ switch (response.StatusCode)
+ {
+ case HttpStatusCode.OK:
+ case HttpStatusCode.NoContent:
+ case HttpStatusCode.Accepted:
+ case HttpStatusCode.Redirect:
+ try
+ {
+ message.Process(response,
+ await response.Content
+ .ReadAsStringAsync());
+
+ message.Dispose();
+ }
+ catch (Exception ex)
+ {
+ LogManager
+ .LogException($"Failed to process the response sent to {message.Request.RequestUri}",
+ nameof(WebClient), ex: ex);
+ }
+
+ break;
+ case HttpStatusCode.Unauthorized:
+ if (_retryBackoffTable.InBounds(message.FailureCount++))
+ {
+ string reason =
+ await response.Content.ReadAsStringAsync();
+
+ LogManager
+ .LogError($"Oauth token has expired: {reason}, attempting to reauthenticate.",
+ nameof(WebClient));
+
+ AuthorizationFailed?.Invoke(Instance, message);
+ }
+ else
+ {
+ LogManager
+ .LogWarning($"Authorization check has failed {message.FailureCount} time(s). Manual reauthorization is required.",
+ nameof(WebClient));
+ }
+
+ break;
+ case HttpStatusCode.RequestTimeout:
+ if (_retryBackoffTable.InBounds(message.FailureCount))
+ {
+ await Task.Delay(_retryBackoffTable
+ [message.FailureCount++]);
+
+ await SendRequestAsync(message);
+ }
+ else
+ {
+ LogManager
+ .LogWarning($"{Instance.BaseAddress} is unreachable after {message.FailureCount} attempt(s). Please try again later",
+ nameof(WebClient));
+ }
+
+ break;
+ default:
+ LogManager
+ .Log($"Received HTTP status code of {response.StatusCode} with Content {await response.Content.ReadAsStringAsync()}. Unsure how to handle that code",
+ nameof(WebClient));
+
+ break;
+ }
+ }
+ catch (Exception ex)
+ {
+ LogManager
+ .LogException($"Failed to send {message.Request.Method} message to {message.Request.RequestUri}",
+ nameof(WebClient), ex: ex);
+ }
+ }
+ }
+}
diff --git a/FluffyVoid.Networking/Web/WebClientMessage.cs b/FluffyVoid.Networking/Web/WebClientMessage.cs
new file mode 100644
index 0000000..0d01fc9
--- /dev/null
+++ b/FluffyVoid.Networking/Web/WebClientMessage.cs
@@ -0,0 +1,147 @@
+namespace FluffyVoid.Networking.Web
+{
+ ///
+ /// Message class used to send HTTP messages to their endpoint
+ ///
+ public class WebClientMessage : WebMessage
+ {
+ ///
+ /// Request callback that will be called when the message has received a
+ /// response back
+ ///
+ public event Action? Callback;
+
+ ///
+ /// Constructor used to initialize the message
+ ///
+ public WebClientMessage() { }
+ ///
+ /// Constructor used to initialize the message
+ ///
+ /// The HTTP delivery method
+ /// The url endpoint for the message
+ public WebClientMessage(WebMethod method, string url)
+ : base(method, url) { }
+ ///
+ /// Constructor used to initialize the message
+ ///
+ /// The HTTP delivery method
+ /// The url endpoint for the message
+ /// A custom id to assign to the message
+ public WebClientMessage(WebMethod method, string url, int requestId)
+ : base(method, url, requestId) { }
+ ///
+ /// Copy constructor that can build a copy of the message but updates the HTTP
+ /// request properly
+ ///
+ /// The request to use in building the message
+ /// The callback to assign to the message
+ ///
+ /// The current number of failed attempts for this
+ /// message
+ ///
+ protected WebClientMessage(HttpRequestMessage request,
+ Action? callback,
+ int failureCount)
+ {
+ FailureCount = failureCount;
+ Request = request.Clone();
+ Callback = callback;
+ }
+
+ ///
+ /// Deep copies the message and returns the copy
+ ///
+ /// The deeply copied web message
+ public override WebMessage DeepClone()
+ {
+ return new WebClientMessage(Request, Callback, FailureCount);
+ }
+ ///
+ /// Processes the message response when the endpoint returns its reply
+ ///
+ /// The http message that was received
+ /// The content of the message
+ public override void Process(HttpResponseMessage message,
+ string payload)
+ {
+ Callback?.Invoke(RequestId, payload);
+ }
+ }
+ ///
+ /// Message class used to send HTTP messages to their endpoint
+ ///
+ public class WebClientMessage : WebMessage
+ where T : Enum
+ {
+ ///
+ /// Request callback that will be called when the message has received a
+ /// response back
+ ///
+ public event Action? Callback;
+
+ ///
+ /// Constructor used to initialize the message
+ ///
+ public WebClientMessage() { }
+ ///
+ /// Constructor used to initialize the message
+ ///
+ /// The HTTP delivery method
+ /// The url endpoint for the message
+ public WebClientMessage(WebMethod method, string url)
+ : base(method, url) { }
+ ///
+ /// Constructor used to initialize the message
+ ///
+ /// The HTTP delivery method
+ /// The url endpoint for the message
+ /// A custom id to assign to the message
+ public WebClientMessage(WebMethod method, string url, int requestId)
+ : base(method, url, requestId) { }
+ ///
+ /// Copy constructor that can build a copy of the message but updates the HTTP
+ /// request properly
+ ///
+ /// The request to use in building the message
+ /// The callback to assign to the message
+ ///
+ /// The api identity/type of message when using multiple
+ /// apis
+ ///
+ ///
+ /// The current number of failed attempts for this
+ /// message
+ ///
+ protected WebClientMessage(HttpRequestMessage request,
+ Action? callback,
+ T? identity,
+ int failureCount)
+ {
+ FailureCount = failureCount;
+ Request = request.Clone();
+ Callback = callback;
+ Identity = identity;
+ }
+
+ ///
+ /// Deep copies the message and returns the copy
+ ///
+ /// The deeply copied web message
+ public override WebMessage DeepClone()
+ {
+ return new WebClientMessage(Request, Callback, Identity,
+ FailureCount);
+ }
+ ///
+ /// Processes the message response when the endpoint returns its reply
+ ///
+ /// The http message that was received
+ /// The content of the message
+ public override void Process(HttpResponseMessage message,
+ string payload)
+ {
+ Callback?.Invoke(RequestId, payload);
+ }
+ }
+}
diff --git a/FluffyVoid.Networking/Web/WebMessage.cs b/FluffyVoid.Networking/Web/WebMessage.cs
new file mode 100644
index 0000000..5fab307
--- /dev/null
+++ b/FluffyVoid.Networking/Web/WebMessage.cs
@@ -0,0 +1,318 @@
+using System.Net.Http.Headers;
+using System.Text;
+using FluffyVoid.Logging;
+using FluffyVoid.Utilities;
+using FluffyVoid.Utilities.Cloning;
+
+namespace FluffyVoid.Networking.Web
+{
+ ///
+ /// Base class for all HTTP web messages
+ ///
+ public class WebMessage : IDisposable, IDeepCloneable
+ {
+ ///
+ /// The number of failure attempts for the message
+ ///
+ public int FailureCount { get; set; }
+ ///
+ /// The cached HTTP request message
+ ///
+ public HttpRequestMessage Request { get; protected set; }
+ ///
+ /// The id of the request
+ ///
+ public int RequestId { get; set; }
+
+ ///
+ /// Constructor that does no initialization, for use by inherited classes when
+ /// wanting to do full initialization at
+ /// that level
+ ///
+ public WebMessage()
+ {
+ Request = null!;
+ }
+ ///
+ /// Constructor used to initialize the web message
+ ///
+ /// The HTTP delivery method
+ /// The url endpoint for the message
+ /// A custom id to assign to the message
+ public WebMessage(WebMethod method, string url, int requestId = -1)
+ {
+ FailureCount = 0;
+ RequestId = requestId;
+ Request =
+ new HttpRequestMessage(new HttpMethod(method.ToString()), url);
+ }
+ ///
+ /// Constructor used to initialize the web message
+ ///
+ /// The HTTP request to store in the web message
+ /// The number of failure attempts for the message
+ /// A custom id to assign to the message
+ protected WebMessage(HttpRequestMessage request,
+ int failureCount,
+ int requestId = -1)
+ {
+ FailureCount = failureCount;
+ RequestId = requestId;
+ Request = request.Clone();
+ }
+
+ ///
+ /// Adds an authorization header to the web message
+ ///
+ /// The authorization type to use
+ /// The value for the authorization header
+ public virtual void AddAuthorizationHeader(AuthorizationType type,
+ string value)
+ {
+ switch (type)
+ {
+ case AuthorizationType.Basic:
+ {
+ string base64EncodedAuthenticationString =
+ Convert.ToBase64String(Encoding.ASCII.GetBytes(value));
+
+ Request.Headers.Authorization =
+ new AuthenticationHeaderValue(type.GetDescription(),
+ base64EncodedAuthenticationString);
+
+ break;
+ }
+ case AuthorizationType.Bearer:
+ {
+ Request.Headers.Authorization =
+ new AuthenticationHeaderValue(type.GetDescription(),
+ value);
+
+ break;
+ }
+ default:
+ {
+ LogManager
+ .LogWarning($"Unhandled authorization type [{type}], manual header assignment required until implemented",
+ nameof(WebMessage));
+
+ break;
+ }
+ }
+ }
+
+ ///
+ /// Adds the passed in content to the message with the desired content type
+ ///
+ /// The content to set as the payload
+ /// The content type to set the payload as
+ public virtual void AddContent(string content, ContentType type)
+ {
+ AddContent(content, type, Encoding.UTF8);
+ }
+ ///
+ /// Adds the passed in content to the message with the desired content type and
+ /// encoding style
+ ///
+ /// The content to set as the payload
+ /// The content type to set the payload as
+ /// The encoding to use when setting the content
+ public virtual void AddContent(string content,
+ ContentType type,
+ Encoding contentEncoding)
+ {
+ Request.Content =
+ new StringContent(content, contentEncoding,
+ type.GetDescription());
+ }
+ ///
+ /// Adds a header KVP to the message
+ ///
+ /// The key of the header
+ /// The value of the header
+ public virtual void AddHeader(string key, string value)
+ {
+ Request.Headers.TryAddWithoutValidation(key, value);
+ }
+ ///
+ /// Adds a User-Agent header to the web message
+ ///
+ /// The name of the product
+ /// The version of the product
+ /// The description, enclosed by (), of the product
+ public virtual void AddUserAgent(string name,
+ string version,
+ string comment)
+ {
+ Request.Headers.UserAgent
+ .Add(new ProductInfoHeaderValue(name, version));
+
+ Request.Headers.UserAgent.Add(new ProductInfoHeaderValue(comment));
+ }
+ ///
+ /// Deeply clones the message and returns a copy
+ ///
+ /// The deeply copied version of this message
+ public virtual WebMessage DeepClone()
+ {
+ return new WebMessage(Request, FailureCount, RequestId);
+ }
+ ///
+ /// Disposes of any resources the message has created
+ ///
+ public virtual void Dispose()
+ {
+ Request.Dispose();
+ }
+
+ ///
+ /// Initializes the WebMessage with values needed to send a request
+ ///
+ /// The HTTP delivery method
+ /// The url endpoint for the message
+ /// A custom id to assign to the message
+ public virtual void Initialize(WebMethod method,
+ string url,
+ int requestId = -1)
+ {
+ FailureCount = 0;
+ RequestId = requestId;
+ Request =
+ new HttpRequestMessage(new HttpMethod(method.ToString()), url);
+ }
+ ///
+ /// Processes the message response when the endpoint returns its reply
+ ///
+ /// The http message that was received
+ /// The content of the message
+ public virtual void Process(HttpResponseMessage message, string payload)
+ {
+ LogManager
+ .LogInfo($"Received response {message.StatusCode}:{message.ReasonPhrase} from [{message.RequestMessage?.RequestUri}]: {payload}",
+ nameof(WebMessage));
+ }
+ ///
+ /// Removes a header KVP from the message by key
+ ///
+ /// The key of the header to remove
+ /// True if the header was successfully removed, otherwise false
+ public bool RemoveHeader(string key)
+ {
+ return Request.Headers.Remove(key);
+ }
+ ///
+ /// Updates an existing header KVP with the new KVP passed in
+ ///
+ /// The key of the header to replace
+ /// The new value of the header
+ public void UpdateHeader(string key, string value)
+ {
+ RemoveHeader(key);
+ AddHeader(key, value);
+ }
+ ///
+ /// Deeply clones the message and returns a copy
+ ///
+ /// The deeply copied version of this message
+ object IDeepCloneable.DeepClone()
+ {
+ return DeepClone();
+ }
+ }
+ ///
+ /// Base class for all HTTP web messages with different oauth points
+ ///
+ public class WebMessage : WebMessage
+ where T : Enum
+ {
+ ///
+ /// The api identity/type of message when using multiple apis
+ ///
+ public T? Identity { get; set; }
+
+ ///
+ /// Constructor that does no initialization, for use by inherited classes when
+ /// wanting to do full initialization at
+ /// that level
+ ///
+ public WebMessage()
+ {
+ Identity = default;
+ }
+ ///
+ /// Constructor used to initialize the web message
+ ///
+ /// The HTTP delivery method
+ /// The url endpoint for the message
+ /// A custom id to assign to the message
+ public WebMessage(WebMethod method, string url, int requestId = -1)
+ : base(method, url, requestId)
+ {
+ Identity = default;
+ }
+ ///
+ /// Constructor used to initialize the web message
+ ///
+ /// The HTTP delivery method
+ /// The url endpoint for the message
+ ///
+ /// The api identity/type of message when using multiple
+ /// apis
+ ///
+ /// A custom id to assign to the message
+ public WebMessage(WebMethod method,
+ string url,
+ T? identity,
+ int requestId = -1)
+ : base(method, url, requestId)
+ {
+ Identity = identity;
+ }
+ ///
+ /// Constructor used to initialize the web message
+ ///
+ /// The HTTP request to store in the web message
+ ///
+ /// The api identity/type of message when using multiple
+ /// apis
+ ///
+ /// The number of failure attempts for the message
+ /// A custom id to assign to the message
+ protected WebMessage(HttpRequestMessage request,
+ T? identity,
+ int failureCount,
+ int requestId = -1)
+ : base(request, failureCount, requestId)
+ {
+ Identity = identity;
+ }
+
+ ///
+ /// Deeply clones the message and returns a copy
+ ///
+ /// The deeply copied version of this message
+ public override WebMessage DeepClone()
+ {
+ return new WebMessage(Request, Identity, FailureCount,
+ RequestId);
+ }
+ ///
+ /// Initializes the WebMessage with values needed to send a request
+ ///
+ /// The HTTP delivery method
+ /// The url endpoint for the message
+ ///
+ /// The api identity/type of message when using multiple
+ /// apis
+ ///
+ /// A custom id to assign to the message
+ public void Initialize(WebMethod method,
+ string url,
+ T identity,
+ int requestId = -1)
+ {
+ base.Initialize(method, url, requestId);
+ Identity = identity;
+ }
+ }
+}
diff --git a/Networking/Web/WebMethod.cs b/FluffyVoid.Networking/Web/WebMethod.cs
similarity index 93%
rename from Networking/Web/WebMethod.cs
rename to FluffyVoid.Networking/Web/WebMethod.cs
index d5b7952..e0387b8 100644
--- a/Networking/Web/WebMethod.cs
+++ b/FluffyVoid.Networking/Web/WebMethod.cs
@@ -3,7 +3,7 @@
namespace FluffyVoid.Networking.Web
{
///
- /// Enum for the different methods of delivering HTTP messages to an endpoing
+ /// Enum for the different methods of delivering HTTP messages to an endpoint
///
public enum WebMethod
{
@@ -26,6 +26,6 @@ public enum WebMethod
///
/// Web API Put method type that saves data to an endpoint
///
- PUT
+ PUT,
}
}
diff --git a/FluffyVoid.Networking/Web/WebServer.cs b/FluffyVoid.Networking/Web/WebServer.cs
new file mode 100644
index 0000000..ee4b2e9
--- /dev/null
+++ b/FluffyVoid.Networking/Web/WebServer.cs
@@ -0,0 +1,281 @@
+using System.Net;
+using System.Net.WebSockets;
+using FluffyVoid.Logging;
+using FluffyVoid.Utilities;
+
+namespace FluffyVoid.Networking.Web
+{
+ ///
+ /// Server class for listening for HTTP based messaging
+ ///
+ public class WebServer
+ {
+ ///
+ /// Cancellation token to use when shutting down the client
+ ///
+ private readonly CancellationTokenSource? _cancelTokenSource;
+ ///
+ /// The http listener for the web server
+ ///
+ private readonly HttpListener _httpListener;
+ ///
+ /// Lock object used to ensure that the queue stays thread safe
+ ///
+ private readonly object _requestLock;
+ ///
+ /// the queue of request message received
+ ///
+ private readonly Queue _requestMessages;
+
+ ///
+ /// Whether the server is currently listening for network traffic or not
+ ///
+ public bool IsListening { get; private set; }
+ ///
+ /// Event used to notify listeners that a DELETE request has just been received
+ ///
+
+ // ReSharper disable once InconsistentNaming
+ public event EventHandler? DELETEMessageReceived;
+ ///
+ /// Event used to notify listeners that a GET request has just been received
+ ///
+
+ // ReSharper disable once InconsistentNaming
+ public event EventHandler? GETMessageReceived;
+ ///
+ /// Event used to notify listeners that a PATCH request has just been received
+ ///
+
+ // ReSharper disable once InconsistentNaming
+ public event EventHandler? PATCHMessageReceived;
+ ///
+ /// Event used to notify listeners that a POST request has just been received
+ ///
+
+ // ReSharper disable once InconsistentNaming
+ public event EventHandler? POSTMessageReceived;
+ ///
+ /// Event used to notify listeners that a PUT request has just been received
+ ///
+
+ // ReSharper disable once InconsistentNaming
+ public event EventHandler? PUTMessageReceived;
+ ///
+ /// Event used to notify listeners that a new web socket client has connected
+ /// to the server
+ ///
+ public event EventHandler?
+ WebSocketClientConnected;
+
+ ///
+ /// Constructor used to set up the listening prefixes for the HTTP server
+ ///
+ /// The list of http prefixes to bind to
+ public WebServer(string[] prefixes)
+ {
+ _requestMessages = new Queue();
+ _requestLock = new object();
+ _httpListener = new HttpListener();
+ _cancelTokenSource = new CancellationTokenSource();
+ foreach (string prefix in prefixes)
+ {
+ _httpListener.Prefixes.Add(prefix);
+ }
+ }
+ ///
+ /// Closes the server and releases all resources
+ ///
+ public virtual void Dispose()
+ {
+ _cancelTokenSource?.Dispose();
+ _httpListener.Stop();
+ }
+ ///
+ /// Listen loop used to allow the server to listen for network traffic without
+ /// blocking the main thread
+ ///
+ public async Task ListenAsync()
+ {
+ if (_cancelTokenSource == null)
+ {
+ return;
+ }
+
+ try
+ {
+ _httpListener.Start();
+ }
+ catch (HttpListenerException ex)
+ {
+ LogManager.LogException("Failed to start server",
+ nameof(WebServer),
+ ex: ex);
+ }
+ catch (Exception ex)
+ {
+ LogManager
+ .LogException("Server threw an exception while starting the http listener",
+ nameof(WebServer), ex: ex);
+ }
+
+ IsListening = true;
+ do
+ {
+ try
+ {
+ HttpListenerContext context =
+ await
+ Task.Run(() => _httpListener.GetContextAsync().WithCancellation(_cancelTokenSource.Token),
+ _cancelTokenSource.Token);
+
+ if (_cancelTokenSource.Token.IsCancellationRequested)
+ {
+ IsListening = false;
+ return;
+ }
+
+ await ProcessMessage(context);
+ }
+ catch (ObjectDisposedException)
+ {
+ IsListening = false;
+ LogManager.Log("Server shutting down->Server Disposed",
+ nameof(WebServer));
+ }
+ catch (TaskCanceledException)
+ {
+ IsListening = false;
+ LogManager.Log("Server shutting down->Task Cancelled",
+ nameof(WebServer));
+ }
+ catch (Exception ex)
+ {
+ LogManager
+ .LogException("Server threw an exception while listening",
+ nameof(WebServer), ex: ex);
+ }
+ } while (IsListening);
+ }
+ ///
+ /// Shuts down the server
+ ///
+ public void Shutdown()
+ {
+ _cancelTokenSource?.Cancel();
+ Dispose();
+ }
+ ///
+ /// Update method that dispatches any received messages via events
+ ///
+ /// The amount of time since the last update call
+ public virtual void Update(float dt)
+ {
+ bool requestsReady;
+ lock (_requestLock)
+ {
+ requestsReady = _requestMessages.Any();
+ }
+
+ if (!requestsReady)
+ {
+ return;
+ }
+
+ WebServerMessage requestToHandle;
+ lock (_requestLock)
+ {
+ requestToHandle = _requestMessages.Dequeue();
+ }
+
+ if (requestToHandle.IsValid)
+ {
+ WebMethod method =
+ EnumUtility
+ .GetValueFromDescription(requestToHandle
+ .HttpMethod);
+
+ switch (method)
+ {
+ case WebMethod.POST:
+ POSTMessageReceived?.Invoke(this, requestToHandle);
+ break;
+ case WebMethod.GET:
+ GETMessageReceived?.Invoke(this, requestToHandle);
+ break;
+ case WebMethod.PATCH:
+ PATCHMessageReceived?.Invoke(this, requestToHandle);
+ break;
+ case WebMethod.DELETE:
+ DELETEMessageReceived?.Invoke(this, requestToHandle);
+ break;
+ case WebMethod.PUT:
+ PUTMessageReceived?.Invoke(this, requestToHandle);
+ break;
+ default:
+ LogManager
+ .LogWarning($"Received unimplemented Http Method {method}",
+ nameof(WebServer));
+
+ break;
+ }
+ }
+ else
+ {
+ LogManager
+ .LogWarning("Received an invalid request from the web",
+ nameof(WebServer));
+ }
+ }
+ ///
+ /// Helper function used to process the incoming web message
+ ///
+ ///
+ /// Reference to the current http context to retrieve a web
+ /// request from
+ ///
+ private async Task ProcessMessage(HttpListenerContext context)
+ {
+ try
+ {
+ HttpListenerRequest request = context.Request;
+ HttpListenerResponse response = context.Response;
+ if (request.IsWebSocketRequest)
+ {
+ HttpListenerWebSocketContext ctx =
+ await context.AcceptWebSocketAsync(null);
+
+ WebSocket webSocket = ctx.WebSocket;
+ WebSocketClientConnected?.Invoke(this,
+ new
+ WebSocketConnectMessage(webSocket,
+ request,
+ response));
+
+ return;
+ }
+
+ lock (_requestLock)
+ {
+ _requestMessages.Enqueue(new WebServerMessage(context,
+ request,
+ response));
+ }
+ }
+ catch (ObjectDisposedException)
+ {
+ LogManager.Log("Received message when server has been disposed",
+ nameof(WebServer));
+ }
+ catch (HttpListenerException)
+ {
+ LogManager.Log("Unknown listener exception", nameof(WebServer));
+ }
+ catch (Exception ex)
+ {
+ LogManager.LogException("Unhandled exception has been caught",
+ nameof(WebServer), ex: ex);
+ }
+ }
+ }
+}
diff --git a/Networking/Web/WebServerMessage.cs b/FluffyVoid.Networking/Web/WebServerMessage.cs
similarity index 100%
rename from Networking/Web/WebServerMessage.cs
rename to FluffyVoid.Networking/Web/WebServerMessage.cs
diff --git a/FluffyVoid.Networking/Web/WebSocketConnectMessage.cs b/FluffyVoid.Networking/Web/WebSocketConnectMessage.cs
new file mode 100644
index 0000000..28c873d
--- /dev/null
+++ b/FluffyVoid.Networking/Web/WebSocketConnectMessage.cs
@@ -0,0 +1,45 @@
+using System.Net;
+using System.Net.WebSockets;
+
+namespace FluffyVoid.Networking.Web
+{
+ ///
+ /// Message class used to hold HTTP items useful for handling HTTP message
+ /// traffic via a WebSocket connection
+ ///
+ public readonly struct WebSocketConnectMessage
+ {
+ ///
+ /// Whether the message is valid or not
+ ///
+ public bool IsValid =>
+ Socket != null && Request != null && Response != null;
+ ///
+ /// Reference to the HTTP request
+ ///
+ public HttpListenerRequest Request { get; }
+ ///
+ /// Reference to the HTTP Response
+ ///
+ public HttpListenerResponse Response { get; }
+ ///
+ /// Reference to the WebSocket connection
+ ///
+ public WebSocket Socket { get; }
+
+ ///
+ /// Constructor used to build the web socket connect message
+ ///
+ /// Reference to the WebSocket connection
+ /// Reference to the HTTP request
+ /// Reference to the HTTP Response
+ public WebSocketConnectMessage(WebSocket socket,
+ HttpListenerRequest request,
+ HttpListenerResponse response)
+ {
+ Socket = socket;
+ Request = request;
+ Response = response;
+ }
+ }
+}
diff --git a/FluffyVoid.Networking/Web/WebUtilities.cs b/FluffyVoid.Networking/Web/WebUtilities.cs
new file mode 100644
index 0000000..5454b48
--- /dev/null
+++ b/FluffyVoid.Networking/Web/WebUtilities.cs
@@ -0,0 +1,38 @@
+namespace FluffyVoid.Networking.Web
+{
+ ///
+ /// Organizational class for utilities that relate to HTTP web tasks
+ ///
+ public static class WebUtilities
+ {
+ ///
+ /// Extension method used to deep clone an existing HTTPRequestMessage
+ ///
+ /// Reference to the existing request
+ /// A deep copy of the passed in request
+ public static HttpRequestMessage Clone(this HttpRequestMessage request)
+ {
+ HttpRequestMessage result =
+ new HttpRequestMessage(request.Method, request.RequestUri)
+ {
+ Content = request.Content,
+ Version = request.Version,
+ };
+
+ foreach (KeyValuePair property in request
+ .Properties)
+ {
+ result.Properties.Add(property);
+ }
+
+ foreach (KeyValuePair> header in request
+ .Headers)
+ {
+ result.Headers.TryAddWithoutValidation(header.Key,
+ header.Value);
+ }
+
+ return result;
+ }
+ }
+}
diff --git a/FluffyVoid.Networking/WebSockets/WebSocketClient.cs b/FluffyVoid.Networking/WebSockets/WebSocketClient.cs
new file mode 100644
index 0000000..b38030f
--- /dev/null
+++ b/FluffyVoid.Networking/WebSockets/WebSocketClient.cs
@@ -0,0 +1,257 @@
+using System.Net;
+using System.Net.WebSockets;
+using System.Text;
+using FluffyVoid.Logging;
+
+namespace FluffyVoid.Networking.WebSockets
+{
+ ///
+ /// Client class used to communicate via WebSocket
+ ///
+ public class WebSocketClient
+ {
+ ///
+ /// Message buffer to use when receiving messages
+ ///
+ private readonly byte[] _buffer = new byte[8192];
+ ///
+ /// Cancellation token used to cancel any active tasks for the client
+ ///
+ private CancellationTokenSource? _cancellationTokenSource;
+
+ ///
+ /// The web socket client to use for sending and receiving messages
+ ///
+ private ClientWebSocket? _client;
+ ///
+ /// Optional header key to add to all messages
+ ///
+ private readonly KeyValuePair _header;
+ ///
+ /// Current reconnect attempt
+ ///
+ private int _reconnectCounter;
+ ///
+ /// Reconnect falloff table to ensure we don't spam a reconnection
+ ///
+ private readonly int[] _reconnectFalloff =
+ [
+ 1000,
+ 2000,
+ 4000,
+ 8000,
+ 16000,
+ 32000,
+ 64000,
+ 128000,
+ ];
+ ///
+ /// The currently connected URI for the connection
+ ///
+ private string? _uri;
+
+ ///
+ /// Whether to allow the client to auto-reconnect or to allow the user to
+ /// handle disconnections
+ ///
+ public bool AutoReconnect { protected get; set; } = false;
+ ///
+ /// The KeepAlive interval for the connection
+ ///
+ public TimeSpan KeepAliveInterval { protected get; set; } =
+ TimeSpan.Zero;
+ ///
+ /// Optional Proxy object to use when making the connection
+ ///
+ public IWebProxy? Proxy { protected get; set; } = null;
+ ///
+ /// Optional SubProtocol for the connection to utilize
+ ///
+ public string? SubProtocol { protected get; set; } = null;
+ ///
+ /// Event used to notify listeners that the client has connected
+ ///
+ public event EventHandler? Connected;
+ ///
+ /// Event used to notify listeners that the client has been disconnected
+ ///
+ public event EventHandler? Disconnected;
+ ///
+ /// Event used to notify listeners that a message has been received
+ ///
+ public event EventHandler? MessageReceived;
+
+ ///
+ /// Default constructor used to initialize the client
+ ///
+ public WebSocketClient() { }
+ ///
+ /// Default constructor used to initialize the client
+ ///
+ /// The header to assign to all messages
+ public WebSocketClient(KeyValuePair header)
+ {
+ _header = header;
+ }
+
+ ///
+ /// Connects the client to the specified URI
+ ///
+ /// The websocket address to connect to
+ public async Task ConnectAsync(string uri)
+ {
+ _client = new ClientWebSocket();
+ _uri = uri;
+ _client.Options.KeepAliveInterval = KeepAliveInterval;
+ if (!string.IsNullOrEmpty(_header.Key) &&
+ !string.IsNullOrEmpty(_header.Value))
+ {
+ _client.Options.SetRequestHeader(_header.Key, _header.Value);
+ }
+
+ if (!string.IsNullOrEmpty(SubProtocol))
+ {
+ _client.Options.AddSubProtocol(SubProtocol);
+ }
+
+ if (Proxy != null)
+ {
+ _client.Options.Proxy = Proxy;
+ }
+
+ if (_cancellationTokenSource != null)
+ {
+ _cancellationTokenSource.Dispose();
+ }
+
+ _cancellationTokenSource = new CancellationTokenSource();
+ await _client.ConnectAsync(new Uri(uri),
+ _cancellationTokenSource.Token);
+
+ if (_client.State == WebSocketState.Open)
+ {
+ Connected?.Invoke(this, EventArgs.Empty);
+ _reconnectCounter = 0;
+ }
+ }
+ ///
+ /// Listens for incoming messages from the connected source
+ ///
+ public async Task ListenAsync()
+ {
+ if (_client == null ||
+ _cancellationTokenSource == null ||
+ _uri == null)
+ {
+ LogManager
+ .LogError("Websocket client has not been created, unable to listen for messages. Call ConnectAsync prior to attempting to ListenAsync.",
+ nameof(WebSocketClient));
+
+ return;
+ }
+
+ StringBuilder message = new StringBuilder();
+ while (!_cancellationTokenSource.IsCancellationRequested)
+ {
+ try
+ {
+ // rx messages
+ WebSocketReceiveResult result;
+ message.Clear();
+ do
+ {
+ result =
+ await
+ _client
+ .ReceiveAsync(new ArraySegment(_buffer),
+ _cancellationTokenSource
+ .Token);
+
+ message.Append(Encoding.UTF8.GetString(_buffer, 0,
+ result.Count));
+ } while (!result.EndOfMessage);
+
+ MessageReceived?.Invoke(this, message.ToString());
+ if (_client.State != WebSocketState.Closed)
+ {
+ continue;
+ }
+
+ if (!AutoReconnect)
+ {
+ break;
+ }
+
+ if (_reconnectCounter >= _reconnectFalloff.Length)
+ {
+ Disconnected?.Invoke(this,
+ $"Websocket connection closed, auto-reconnect failed after {_reconnectFalloff.Length} attempts.");
+
+ return;
+ }
+
+ Disconnected?.Invoke(this,
+ $"Websocket connection closed, attempting auto-reconnect with server in {_reconnectFalloff[_reconnectCounter] / 1000} second(s)");
+
+ await Task.Delay(_reconnectFalloff[_reconnectCounter++]);
+ await ConnectAsync(_uri);
+ }
+ catch (OperationCanceledException)
+ {
+ Disconnected?.Invoke(this,
+ "Websocket connection shutdown by the client.");
+
+ return;
+ }
+ catch (Exception ex)
+ {
+ Disconnected?.Invoke(this,
+ $"Websocket connection threw an exception, shutting down the connection./n{ex.Message}");
+
+ return;
+ }
+ }
+
+ Disconnected?.Invoke(this, "Websocket connection closed.");
+ }
+ ///
+ /// Sends a message via the WebSocket connection
+ ///
+ /// The message to send
+ public async Task SendMessageAsync(string message)
+ {
+ if (_client == null || _cancellationTokenSource == null)
+ {
+ LogManager
+ .LogError($"Websocket client has not been created, unable to send {message}",
+ nameof(WebSocketClient));
+
+ return;
+ }
+
+ if (_client.State != WebSocketState.Open)
+ {
+ LogManager
+ .LogError($"No active Websocket connection, unable to send {message}",
+ nameof(WebSocketClient));
+
+ return;
+ }
+
+ try
+ {
+ await
+ _client
+ .SendAsync(new ArraySegment(Encoding.UTF8.GetBytes(message)),
+ WebSocketMessageType.Text, true,
+ _cancellationTokenSource.Token);
+ }
+ catch (Exception ex)
+ {
+ LogManager
+ .LogException($"Sending {message} via Websocket connection failed",
+ nameof(WebSocketClient), ex: ex);
+ }
+ }
+ }
+}
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..16b9690
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 Ashiryn
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Networking/Udp/ClientConnectionInformation.cs b/Networking/Udp/ClientConnectionInformation.cs
deleted file mode 100644
index 2e94e60..0000000
--- a/Networking/Udp/ClientConnectionInformation.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-namespace FluffyVoid.Networking.Udp;
-
-///
-/// Data class used to store information about a clients connection
-///
-public class ClientConnectionInformation : IUdpSerializable
-{
- ///
- /// The id that was assigned to the client
- ///
- public short Id { get; private set; }
- ///
- /// The name of the client
- ///
- public string Name { get; private set; }
- ///
- /// Whether the connection was successful or not
- ///
- public bool Successful { get; private set; }
-
- ///
- /// Default constructor for the data class ensuring proper deserialization
- ///
- public ClientConnectionInformation()
- {
- Name = string.Empty;
- }
- ///
- /// Constructor used to initialize the data class with a clients name
- ///
- ///
- /// Most often used by the client to request a connection to the server
- ///
- /// The name the client will be connecting as
- public ClientConnectionInformation(string name)
- {
- Name = name;
- }
- ///
- /// Constructor used to initialize the data class
- ///
- ///
- /// Most often used by the server to inform the connecting client if the connection was successful and their new client
- /// ID
- ///
- /// The name the client will be connecting as
- /// The id that is to be assigned to the client
- /// Whether the connection was successful or not
- public ClientConnectionInformation(string name, short id, bool success)
- {
- Name = name;
- Id = id;
- Successful = success;
- }
- ///
- /// Deserialization method used to deserialize the data in this class from a network byte stream
- ///
- /// The serialization event arg to use in the deserialization process
- public void Deserialize(UdpDeserializerEventArgs e)
- {
- Name = e.Reader.ReadString();
- Id = e.Reader.ReadShort();
- Successful = e.Reader.ReadBool();
- }
-
- ///
- /// Serialization method used to serialize the data in this class to a network byte stream
- ///
- /// The serialization event arg to use in the serialization process
- public int Serialize(UdpSerializerEventArgs e)
- {
- int count = e.Writer.WriteString(Name);
- count += e.Writer.WriteShort(Id);
- count += e.Writer.WriteBool(Successful);
- return count;
- }
-}
\ No newline at end of file
diff --git a/Networking/Udp/ClientMessageTagRegistration.cs b/Networking/Udp/ClientMessageTagRegistration.cs
deleted file mode 100644
index abd6cdf..0000000
--- a/Networking/Udp/ClientMessageTagRegistration.cs
+++ /dev/null
@@ -1,75 +0,0 @@
-using FluffyVoid.Utilities;
-
-namespace FluffyVoid.Networking.Udp;
-
-///
-/// Serializable data class that a client can send to register receiving messages for the desired tags only
-///
-public class ClientMessageTagRegistration : IUdpSerializable
-{
- ///
- /// The list of tags to register to
- ///
- private List _tags;
-
- ///
- /// Constructor used to set up the tags to register
- ///
- /// Param list of tags to register
- public ClientMessageTagRegistration(params ushort[] tagsToRegister)
- {
- _tags = new List(tagsToRegister);
- }
- ///
- /// Constructor used to set up the tags to register to via enum
- ///
- /// Param list of enum tags to register
- public ClientMessageTagRegistration(params Enum[] tagsToRegister)
- {
- _tags = new List(tagsToRegister.Select(x => x.ToUshort()));
- }
- ///
- /// Constructor used to set up the tags to register
- ///
- /// Param list of tags to register
- public ClientMessageTagRegistration(List tagsToRegister)
- {
- _tags = new List(tagsToRegister);
- }
- ///
- /// Constructor used to set up the tags to register to via enum
- ///
- /// Param list of enum tags to register
- public ClientMessageTagRegistration(List tagsToRegister)
- {
- _tags = new List(tagsToRegister.Select(x => x.ToUshort()));
- }
- ///
- /// Deserializes the list of tags from a udp stream
- ///
- /// The deserializer args to use in deserializing the data
- public void Deserialize(UdpDeserializerEventArgs e)
- {
- ushort count = e.Reader.ReadUshort();
- _tags = new List();
- for (int index = 0; index < count; ++index)
- {
- _tags.Add(e.Reader.ReadUshort());
- }
- }
-
- ///
- /// Serializes the list of tags to a udp stream
- ///
- /// The serializer args to use in serializing the data
- public int Serialize(UdpSerializerEventArgs e)
- {
- int count = e.Writer.WriteUshort((ushort)_tags.Count);
- foreach (ushort currentTag in _tags)
- {
- count += e.Writer.WriteUshort(currentTag);
- }
-
- return count;
- }
-}
\ No newline at end of file
diff --git a/Networking/Udp/EventArguments/ClientConnectedEventArgs.cs b/Networking/Udp/EventArguments/ClientConnectedEventArgs.cs
deleted file mode 100644
index ed77de2..0000000
--- a/Networking/Udp/EventArguments/ClientConnectedEventArgs.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-namespace FluffyVoid.Networking.Udp;
-
-///
-/// Event arg for use when a client has connected to an endpoint
-///
-public class ClientConnectedEventArgs : EventArgs
-{
- ///
- /// The client information to send with the event arg
- ///
- public ClientConnectionInformation ClientInfo { get; }
-
- ///
- /// Constructor used to initialize the event arg
- ///
- /// The client information data to store
- public ClientConnectedEventArgs(ClientConnectionInformation info)
- {
- ClientInfo = info;
- }
-}
\ No newline at end of file
diff --git a/Networking/Udp/EventArguments/ClientDisconnectedEventArgs.cs b/Networking/Udp/EventArguments/ClientDisconnectedEventArgs.cs
deleted file mode 100644
index f03f150..0000000
--- a/Networking/Udp/EventArguments/ClientDisconnectedEventArgs.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-namespace FluffyVoid.Networking.Udp;
-
-///
-/// Event arg for use when a client has disconnected from an endpoint
-///
-public class ClientDisconnectedEventArgs : EventArgs
-{
- ///
- /// The client information to send with the event arg
- ///
- public ClientConnectionInformation ClientInfo { get; }
- ///
- /// Whether the disconnect was initiated by the connected client or not
- ///
- public bool IsLocalDisconnect { get; }
-
- ///
- /// Constructor used to initialize the event arg
- ///
- /// Whether the disconnect was initiated by the connected client or not
- /// The client information data to store
- public ClientDisconnectedEventArgs(bool isLocalDisconnect,
- ClientConnectionInformation info)
- {
- IsLocalDisconnect = isLocalDisconnect;
- ClientInfo = info;
- }
-}
\ No newline at end of file
diff --git a/Networking/Udp/EventArguments/UdpDeserializerEventArgs.cs b/Networking/Udp/EventArguments/UdpDeserializerEventArgs.cs
deleted file mode 100644
index 63e628f..0000000
--- a/Networking/Udp/EventArguments/UdpDeserializerEventArgs.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-namespace FluffyVoid.Networking.Udp;
-
-///
-/// Event arg used for deserializing custom classes from a UDP network stream
-///
-public class UdpDeserializerEventArgs : EventArgs
-{
- ///
- /// Reference to the UdpReader assigned to the network stream
- ///
- public UdpReader Reader { get; }
-
- ///
- /// Constructor used to pass the UdpReader as part of the event arg
- ///
- /// The reader to assign to the event arg
- public UdpDeserializerEventArgs(UdpReader reader)
- {
- Reader = reader;
- }
-}
\ No newline at end of file
diff --git a/Networking/Udp/EventArguments/UdpMessageEventArgs.cs b/Networking/Udp/EventArguments/UdpMessageEventArgs.cs
deleted file mode 100644
index 2b0c170..0000000
--- a/Networking/Udp/EventArguments/UdpMessageEventArgs.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-namespace FluffyVoid.Networking.Udp;
-
-///
-/// Event arg for use when receiving a UDP message
-///
-public class UdpMessageEventArgs
- : EventArgs, INetworkMessageEventArgs
-{
- ///
- /// The Udp message to send with the event arg
- ///
- public UdpMessage Message { get; }
- ///
- /// The tag associated with the message
- ///
- public ushort Tag => Message?.Tag ?? 0;
- ///
- /// Constructor used to initialize the event arg
- ///
- /// The udp message to store
- public UdpMessageEventArgs(UdpMessage message)
- {
- Message = message;
- }
-}
\ No newline at end of file
diff --git a/Networking/Udp/EventArguments/UdpSendByNameRequestEventArgs.cs b/Networking/Udp/EventArguments/UdpSendByNameRequestEventArgs.cs
deleted file mode 100644
index 4f00d68..0000000
--- a/Networking/Udp/EventArguments/UdpSendByNameRequestEventArgs.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-namespace FluffyVoid.Networking.Udp;
-
-///
-/// Event args used to store UDP message information for a client by Name
-///
-public class UdpSendByNameRequestEventArgs : EventArgs
-{
- ///
- /// The message to send to the client
- ///
- public UdpMessage Message { get; }
- ///
- /// Name of the client the message is intended for
- ///
- public string Name { get; }
-
- ///
- /// Constructor used to initialize the data
- ///
- /// Name of the client the message is intended for
- /// The message to send to the client
- public UdpSendByNameRequestEventArgs(string name, UdpMessage message)
- {
- Name = name;
- Message = message;
- }
-}
\ No newline at end of file
diff --git a/Networking/Udp/EventArguments/UdpSendByTagRequestEventArgs.cs b/Networking/Udp/EventArguments/UdpSendByTagRequestEventArgs.cs
deleted file mode 100644
index 0fc2fd4..0000000
--- a/Networking/Udp/EventArguments/UdpSendByTagRequestEventArgs.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-namespace FluffyVoid.Networking.Udp;
-
-///
-/// Event args used to store UDP message information for a client by Tag
-///
-public class UdpSendByTagRequestEventArgs : EventArgs
-{
- ///
- /// The message to send to the client
- ///
- public UdpMessage Message { get; }
-
- ///
- /// Constructor used to initialize the data
- ///
- /// Name of the client the message is intended for
- /// The message to send to the client
- public UdpSendByTagRequestEventArgs(string name, UdpMessage message)
- {
- Message = message;
- }
-}
\ No newline at end of file
diff --git a/Networking/Udp/EventArguments/UdpSerializerEventArgs.cs b/Networking/Udp/EventArguments/UdpSerializerEventArgs.cs
deleted file mode 100644
index 8409292..0000000
--- a/Networking/Udp/EventArguments/UdpSerializerEventArgs.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-namespace FluffyVoid.Networking.Udp;
-
-///
-/// Event arg used for serializing custom classes to a UDP network stream
-///
-public class UdpSerializerEventArgs : EventArgs
-{
- ///
- /// Reference to the UdpWriter assigned to the network stream
- ///
- public UdpWriter Writer { get; }
-
- ///
- /// Constructor used to pass the UdpWriter as part of the event arg
- ///
- /// The writer to assign to the event arg
- public UdpSerializerEventArgs(UdpWriter writer)
- {
- Writer = writer;
- }
-}
\ No newline at end of file
diff --git a/Networking/Udp/GlobalUdpMessageTag.cs b/Networking/Udp/GlobalUdpMessageTag.cs
deleted file mode 100644
index be224b9..0000000
--- a/Networking/Udp/GlobalUdpMessageTag.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-namespace FluffyVoid.Networking.Udp;
-
-///
-/// Enumeration for globally shared upd tags that the udp networking utilizes
-///
-public enum GlobalUdpMessageTag : ushort
-{
- ///
- /// Message tag used for client connect messages
- ///
- ClientConnected = 0,
- ///
- /// Message tag for client disconnect messages
- ///
- ClientDisconnected,
- ///
- /// Message tag for Pong messages
- ///
- Pong,
- ///
- /// Message tag for Ping messages
- ///
- Ping,
- ///
- /// Message tag for unknown client messages
- ///
- UnknownClient,
-
- ///
- /// Reserved unused tag
- ///
- Unused = 200
-}
\ No newline at end of file
diff --git a/Networking/Udp/HeartBeat.cs b/Networking/Udp/HeartBeat.cs
deleted file mode 100644
index 1597cbc..0000000
--- a/Networking/Udp/HeartBeat.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-namespace FluffyVoid.Networking.Udp;
-
-///
-/// Class used to track and manage a heartbeat with another client/server
-///
-public class HeartBeat
-{
- ///
- /// Amount of time the ping window will stay open
- ///
- private readonly float _pingWindow;
- ///
- /// Amount of time the pong window will stay open
- ///
- private readonly float _pongWindow;
- ///
- /// Amount of time that has currently elapsed in the current window
- ///
- private float _elapsed;
- ///
- /// Whether the heartbeat is currently in the Ping or the Pong window
- ///
- private bool _isPingWindowOpen;
- ///
- /// Event to notify that the window for waiting on a Ping message has closed
- ///
- public event Func? PingWindowEnded;
- ///
- /// Event to notify that the window for waiting on a Pong message has closed
- ///
- public event Func? PongWindowEnded;
-
- ///
- /// Constructor used to initialize the Ping and Pong windows
- ///
- /// Amount of time the pong window will stay open
- /// Amount of time the ping window will stay open
- public HeartBeat(float pongInterval, float pingInterval)
- {
- _elapsed = _pongWindow = pongInterval;
- _pingWindow = pingInterval;
- _isPingWindowOpen = false;
- }
-
- ///
- /// Update method that calculates whether a window has changed or ended
- ///
- /// The amount of time since the last update call
- public async Task Update(float dt)
- {
- _elapsed -= dt;
- if (_elapsed > 0.0f)
- {
- return;
- }
-
- if (!_isPingWindowOpen)
- {
- _isPingWindowOpen = true;
- _elapsed = _pingWindow;
- if (PongWindowEnded != null)
- {
- await PongWindowEnded.Invoke();
- }
- }
- else
- {
- _isPingWindowOpen = false;
- _elapsed = _pongWindow;
- if (PingWindowEnded != null)
- {
- await PingWindowEnded.Invoke();
- }
- }
- }
-}
\ No newline at end of file
diff --git a/Networking/Udp/IUdpSerializable.cs b/Networking/Udp/IUdpSerializable.cs
deleted file mode 100644
index 0fac70d..0000000
--- a/Networking/Udp/IUdpSerializable.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-namespace FluffyVoid.Networking.Udp;
-
-///
-/// Defines a contract for any class that can be serialized and deserialized to a udp network stream
-///
-public interface IUdpSerializable
-{
- ///
- /// Defines functionality for deserializing data from a UDP reader
- ///
- /// Event arg containing data needed to read from the UDP stream
- void Deserialize(UdpDeserializerEventArgs e);
- ///
- /// Defines functionality for serializing data to a UDP writer
- ///
- /// Event arg containing data needed to write to the UDP stream
- int Serialize(UdpSerializerEventArgs e);
-}
\ No newline at end of file
diff --git a/Networking/Udp/NetworkMessageDispatcher.cs b/Networking/Udp/NetworkMessageDispatcher.cs
deleted file mode 100644
index db79aa1..0000000
--- a/Networking/Udp/NetworkMessageDispatcher.cs
+++ /dev/null
@@ -1,136 +0,0 @@
-namespace FluffyVoid.Networking.Udp;
-
-///
-/// Class used to allow external classes to register to incoming network messages with an appropriate callback
-///
-/// The type of network message the dispatcher is responsible for
-/// The type of event args that the dispatcher is expecting to work with
-public class NetworkMessageDispatcher
- where TNetworkMessage : INetworkMessage
- where TNetworkEventArgs : INetworkMessageEventArgs
-{
- ///
- /// Queue used to store and free up network message handling quicker, items are dispatched during an update cycle
- ///
- protected Queue DispatchQueue { get; private set; } =
- new Queue();
- ///
- /// Routing table for incoming message traffic to callbacks based on the Tag of a message
- ///
- protected Dictionary?>
- MessageRoutingTable { get; private set; } =
- new Dictionary?>();
- ///
- /// Lock object to enforce thread safety
- ///
- protected object ThreadLock { get; set; } = new object();
- ///
- /// Clears the routing table of all entries
- ///
- public void Clear()
- {
- lock (ThreadLock)
- {
- MessageRoutingTable.Clear();
- }
- }
-
- ///
- /// Initializes the dispatcher for use
- ///
- public void Initialize()
- {
- ThreadLock = new object();
- MessageRoutingTable =
- new Dictionary?>();
-
- DispatchQueue = new Queue();
- }
- ///
- /// Prepares an event arg for dispatching according to thread safety rules
- ///
- /// The event arg to dispatch
- public void PrepareForDispatch(TNetworkEventArgs e)
- {
- lock (ThreadLock)
- {
- DispatchQueue.Enqueue(e);
- }
- }
- ///
- /// Registers a callback to a desired message tag id
- ///
- /// The message tag id to register to
- /// The callback to use when a message with the desired tag is received
- public void RegisterMessageDestination(ushort destination,
- Action route)
- {
- lock (ThreadLock)
- {
- MessageRoutingTable.TryAdd(destination, null);
- MessageRoutingTable[destination] += route;
- }
- }
- ///
- /// Removes a registered callback from the routing table
- ///
- /// The message tag id to remove from
- /// The callback to remove
- public void RemoveMessageDestination(ushort destination,
- Action route)
- {
- lock (ThreadLock)
- {
- if (MessageRoutingTable.ContainsKey(destination))
- {
- MessageRoutingTable[destination] -= route;
- }
- }
- }
- ///
- /// Removes an entire tag entry from the routing table
- ///
- /// The message tag id to remove from the routing table
- public void RemoveMessageDestination(ushort destination)
- {
- lock (ThreadLock)
- {
- if (MessageRoutingTable.ContainsKey(destination))
- {
- MessageRoutingTable[destination] = null;
- }
-
- MessageRoutingTable.Remove(destination);
- }
- }
- ///
- /// Checks for any queued message events to dispatch, dispatching 1 per cycle if any exist
- ///
- public virtual void Update()
- {
- lock (ThreadLock)
- {
- if (!DispatchQueue.Any())
- {
- return;
- }
-
- TNetworkEventArgs currentDispatch = DispatchQueue.Dequeue();
- Dispatch(currentDispatch);
- }
- }
- ///
- /// Helper function used to check for and fire callbacks for the incoming message event arg
- ///
- /// The event arg to dispatch out to all registered callbacks
- protected virtual void Dispatch(TNetworkEventArgs e)
- {
- if (!MessageRoutingTable.ContainsKey(e.Tag) ||
- MessageRoutingTable[e.Tag] == null)
- {
- return;
- }
-
- MessageRoutingTable[e.Tag]?.Invoke(e);
- }
-}
\ No newline at end of file
diff --git a/Networking/Udp/NetworkUdpClient.cs b/Networking/Udp/NetworkUdpClient.cs
deleted file mode 100644
index e537380..0000000
--- a/Networking/Udp/NetworkUdpClient.cs
+++ /dev/null
@@ -1,331 +0,0 @@
-using System.Net;
-using System.Net.Sockets;
-using FluffyVoid.Logging;
-using FluffyVoid.Utilities;
-
-namespace FluffyVoid.Networking.Udp;
-
-///
-/// Client class used to communicate via UDP
-///
-public class NetworkUdpClient : IDisposable
-{
- ///
- /// Cancellation token to use when shutting down the client
- ///
- private CancellationTokenSource? _cancelTokenSource;
-
- ///
- /// The UDPClient to use for network communication
- ///
- private UdpClient? _client;
- ///
- /// The name of the client
- ///
- public string Name { get; }
-
- ///
- /// ID that has been assigned to the client by the server
- ///
- public short Id { get; private set; }
- ///
- /// Whether the client is currently connected or not
- ///
- public bool IsConnected { get; private set; }
- ///
- /// Whether the server is currently listening for network traffic or not
- ///
- public bool IsListening { get; private set; }
- ///
- /// Event raised when the client has connected to the server
- ///
- public event EventHandler? Connected;
- ///
- /// Event raised when the client has disconnected from the server
- ///
- public event EventHandler? Disconnected;
- ///
- /// Event raised when the client has received a message from the server
- ///
- public event EventHandler? MessageReceived;
- ///
- /// Event raised when the client has received a message from the server that it is not currently registered
- ///
- public event EventHandler? ServerUnregistered;
-
- ///
- /// Constructor used to create a new UDP client
- ///
- public NetworkUdpClient(string name)
- {
- Id = -1;
- Name = name;
- }
- ///
- /// Connects to a server by host name
- ///
- /// The host name to connect to, E.G. www.ashiryn.servequake.com
- /// The port to connect to
- public void Connect(string hostName, int port)
- {
- _client = new UdpClient();
- _cancelTokenSource = new CancellationTokenSource();
- _client.Connect(hostName, port);
- IsConnected = true;
- }
- ///
- /// Connects to a server by ip address
- ///
- /// The ip string address to connect to, E.G 192.168.1.1
- /// The port to connect to
- public void ConnectViaIp(string ipAddress, int port)
- {
- _client = new UdpClient();
- _cancelTokenSource = new CancellationTokenSource();
- if (IPAddress.TryParse(ipAddress, out IPAddress? connectAddress))
- {
- IPEndPoint endpoint = new IPEndPoint(connectAddress, port);
- _client.Connect(endpoint);
- IsConnected = true;
- }
- }
- ///
- /// Disconnects the client from the server
- ///
- public void Disconnect()
- {
- if (!IsConnected)
- {
- return;
- }
-
- ClientConnectionInformation info =
- new ClientConnectionInformation(Name, Id, true);
-
- Disconnected?.Invoke(this, new ClientDisconnectedEventArgs(true, info));
- UdpMessage connectMessage =
- new UdpMessage(GlobalUdpMessageTag.ClientDisconnected);
-
- UdpWriter writer = connectMessage.GetWriter();
- writer.Write(info);
- Send(connectMessage);
- _cancelTokenSource?.Cancel();
- Dispose();
- }
- ///
- /// Disconnects the client from the server asynchronously
- ///
- public async Task DisconnectAsync()
- {
- if (!IsConnected)
- {
- return;
- }
-
- ClientConnectionInformation info =
- new ClientConnectionInformation(Name, Id, true);
-
- UdpMessage connectMessage =
- new UdpMessage(GlobalUdpMessageTag.ClientDisconnected);
-
- UdpWriter writer = connectMessage.GetWriter();
- writer.Write(info);
- await SendAsync(connectMessage);
- if (_cancelTokenSource != null)
- {
- _cancelTokenSource.Cancel();
- }
-
- Dispose();
- }
-
- ///
- /// Closes the client and releases all resources
- ///
- public void Dispose()
- {
- IsConnected = false;
- _cancelTokenSource?.Dispose();
- _client?.Dispose();
- }
- ///
- /// Listen loop used to allow the client to listen for network traffic without blocking the main thread
- ///
- public async Task ListenAsync()
- {
- if (_client == null || _cancelTokenSource == null)
- {
- LogManager
- .LogError("Unable to start listening for network traffic. Client is not properly connected.",
- nameof(NetworkUdpClient));
-
- return;
- }
-
- do
- {
- IsListening = true;
- try
- {
- UdpReceiveResult udpResult =
- await
- Task.Run(() => _client.ReceiveAsync().WithCancellation(_cancelTokenSource.Token),
- _cancelTokenSource.Token);
-
- if (_cancelTokenSource.Token.IsCancellationRequested)
- {
- IsListening = false;
- return;
- }
-
- await ProcessMessage(new UdpMessage(udpResult));
- }
- catch (ObjectDisposedException)
- {
- IsListening = false;
- LogManager.Log("Client shutting down->Client Disposed",
- nameof(NetworkUdpClient));
- }
- catch (TaskCanceledException)
- {
- IsListening = false;
- LogManager.Log("Client shutting down->Task Cancelled",
- nameof(NetworkUdpClient));
- }
- catch (Exception ex)
- {
- IsListening = false;
- LogManager
- .LogException("Client threw an exception while listening",
- nameof(NetworkUdpClient), ex: ex);
- }
- } while (IsListening);
- }
- ///
- /// Sends a message to the server
- ///
- /// The message to send to the server
- /// The number of bytes sent out
- public int Send(UdpMessage message)
- {
- if (!IsConnected || _client == null)
- {
- return -1;
- }
-
- message.GetWriter().WriteRaw(BitConverter.GetBytes(Id), 0);
- return _client.Send(message.Buffer, message.Length);
- }
- ///
- /// Sends a message to the server
- ///
- /// The message to send to the server
- /// The number of bytes sent out
- public async Task SendAsync(UdpMessage message)
- {
- if (!IsConnected || _client == null)
- {
- return -1;
- }
-
- message.GetWriter().WriteRaw(BitConverter.GetBytes(Id), 0);
- return await _client.SendAsync(message.Buffer, message.Length);
- }
- ///
- /// Sends a connection message to the server with the currently registered name of the client
- ///
- /// The number of bytes sent out
- public int SendConnectionInformation()
- {
- ClientConnectionInformation info =
- new ClientConnectionInformation(Name);
-
- UdpMessage connectMessage =
- new UdpMessage(GlobalUdpMessageTag.ClientConnected);
-
- UdpWriter writer = connectMessage.GetWriter();
- writer.Write(info);
- return Send(connectMessage);
- }
- ///
- /// Sends a connection message to the server with the currently registered name of the client
- ///
- /// The number of bytes sent out
- public async Task SendConnectionInformationAsync()
- {
- ClientConnectionInformation info =
- new ClientConnectionInformation(Name);
-
- UdpMessage connectMessage =
- new UdpMessage(GlobalUdpMessageTag.ClientConnected);
-
- UdpWriter writer = connectMessage.GetWriter();
- writer.Write(info);
- return await SendAsync(connectMessage);
- }
-
- ///
- /// Helper function used to process the incoming udp message
- ///
- /// The incoming udp message to process
- private async Task ProcessMessage(UdpMessage message)
- {
- UdpReader reader = message.GetReader();
- switch (message.Tag)
- {
- case (ushort)GlobalUdpMessageTag.ClientConnected:
- {
- ClientConnectionInformation connectionInfo =
- reader.Read();
-
- Id = connectionInfo.Id;
- IsConnected = true;
- Connected?.Invoke(this,
- new
- ClientConnectedEventArgs(connectionInfo));
-
- LogManager
- .LogInfo($"{connectionInfo.Name} registered: {connectionInfo.Successful}",
- nameof(NetworkUdpClient));
-
- break;
- }
- case (ushort)GlobalUdpMessageTag.ClientDisconnected:
- {
- ClientConnectionInformation connectionInfo =
- reader.Read();
-
- IsConnected = false;
- Disconnected?.Invoke(this,
- new
- ClientDisconnectedEventArgs(connectionInfo.Successful,
- connectionInfo));
-
- LogManager
- .LogInfo($"{connectionInfo.Name} disconnected from server Locally:{connectionInfo.Successful}",
- nameof(NetworkUdpClient));
-
- break;
- }
- case (ushort)GlobalUdpMessageTag.Ping:
- {
- LogManager
- .LogVerbose("PING message received from server, replying with PONG message",
- nameof(NetworkUdpClient));
-
- await SendAsync(new UdpMessage(GlobalUdpMessageTag.Pong));
- break;
- }
- case (ushort)GlobalUdpMessageTag.UnknownClient:
- {
- ServerUnregistered?.Invoke(this, EventArgs.Empty);
- break;
- }
- default:
- {
- MessageReceived?.Invoke(this, new UdpMessageEventArgs(message));
- break;
- }
- }
- }
-}
\ No newline at end of file
diff --git a/Networking/Udp/NetworkUdpServer.cs b/Networking/Udp/NetworkUdpServer.cs
deleted file mode 100644
index e9b7c9a..0000000
--- a/Networking/Udp/NetworkUdpServer.cs
+++ /dev/null
@@ -1,476 +0,0 @@
-using System.Net;
-using System.Net.Sockets;
-using FluffyVoid.Logging;
-using FluffyVoid.Utilities;
-
-namespace FluffyVoid.Networking.Udp;
-
-///
-/// Server class used to communicate via UDP
-///
-public class NetworkUdpServer : IDisposable
-{
- ///
- /// Cancellation token to use when shutting down the client
- ///
- private readonly CancellationTokenSource? _cancelTokenSource;
- ///
- /// List of clients connected to the server by assigned client id
- ///
- private readonly Dictionary _clientList;
- ///
- /// Client lookup table linking a name to index within the list of clients
- ///
- private readonly Dictionary> _clientLookupTable;
- ///
- /// Heartbeat system used to track active clients and ensure stale clients can be detected
- ///
- private readonly HeartBeat _clientMonitor;
- ///
- /// List of clients that have been detected as stale and should be removed
- ///
- private readonly List _disconnectionList;
- ///
- /// The UdpClient to use for network communication
- ///
- private readonly UdpClient _server;
- ///
- /// Starting id to assign to connecting clients
- ///
- private short _clientIdCount;
-
- ///
- /// Whether the server is currently listening for network traffic or not
- ///
- public bool IsListening { get; private set; }
- ///
- /// Event raised when a client has connected to the server
- ///
- public event EventHandler? ClientConnected;
- ///
- /// Event raised when a client has disconnected from the server
- ///
- public event EventHandler? ClientDisconnected;
- ///
- /// Event raised when the server receives a message from a connected client
- ///
- public event EventHandler? MessageReceived;
-
- ///
- /// Constructor for the server that binds the server to a desired port
- ///
- /// The port the server will bind to and listen on
- public NetworkUdpServer(int port)
- {
- _server = new UdpClient();
- _cancelTokenSource = new CancellationTokenSource();
- _clientMonitor = new HeartBeat(600, 10);
- _clientMonitor.PongWindowEnded += ClientMonitorOnPongWindowEnded;
- _clientMonitor.PingWindowEnded += ClientMonitorOnPingWindowEnded;
- _disconnectionList = new List();
- _clientList = new Dictionary();
- _clientLookupTable = new Dictionary>();
- _server.ExclusiveAddressUse = false;
- _server.Client.SetSocketOption(SocketOptionLevel.Socket,
- SocketOptionName.ReuseAddress, true);
-
- _server.Client.Bind(new IPEndPoint(IPAddress.Any, port));
- }
- ///
- /// Constructor for the server that binds the server to a desired port and allows for a custom heartbeat interval
- ///
- /// The port the server will bind to and listen on
- /// The amount of time to wait before sending PONG messages
- ///
- /// The amount of time to wait before disconnecting clients who haven't responded with a PING
- /// messages
- ///
- public NetworkUdpServer(int port, float pongInterval, float pingInterval)
- {
- _server = new UdpClient();
- _cancelTokenSource = new CancellationTokenSource();
- _clientMonitor = new HeartBeat(pongInterval, pingInterval);
- _clientMonitor.PongWindowEnded += ClientMonitorOnPongWindowEnded;
- _clientMonitor.PingWindowEnded += ClientMonitorOnPingWindowEnded;
- _disconnectionList = new List();
- _clientList = new Dictionary();
- _clientLookupTable = new Dictionary>();
- _server.ExclusiveAddressUse = false;
- _server.Client.SetSocketOption(SocketOptionLevel.Socket,
- SocketOptionName.ReuseAddress, true);
-
- _server.Client.Bind(new IPEndPoint(IPAddress.Any, port));
- }
-
- ///
- /// Closes the server and releases all resources
- ///
- public virtual void Dispose()
- {
- _cancelTokenSource?.Dispose();
- _server.Dispose();
- }
- ///
- /// Listen loop used to allow the server to listen for network traffic without blocking the main thread
- ///
- public virtual async Task ListenAsync()
- {
- if (_cancelTokenSource == null)
- {
- return;
- }
-
- IsListening = true;
- do
- {
- try
- {
- UdpReceiveResult udpResult =
- await
- Task.Run(() => _server.ReceiveAsync().WithCancellation(_cancelTokenSource.Token),
- _cancelTokenSource.Token);
-
- if (_cancelTokenSource.Token.IsCancellationRequested)
- {
- IsListening = false;
- return;
- }
-
- await ProcessMessage(new UdpMessage(udpResult), udpResult);
- }
- catch (ObjectDisposedException)
- {
- IsListening = false;
- LogManager.Log("Server shutting down->Server Disposed",
- nameof(NetworkUdpServer));
- }
- catch (TaskCanceledException)
- {
- IsListening = false;
- LogManager.Log("Server shutting down->Task Cancelled",
- nameof(NetworkUdpServer));
- }
- catch (Exception ex)
- {
- LogManager
- .LogException("Server threw an exception while listening",
- nameof(NetworkUdpServer), ex: ex);
- }
- } while (IsListening);
- }
- ///
- /// Sends a message to all connected clients
- ///
- /// The message to send to the client
- public async Task SendAllAsync(UdpMessage message)
- {
- List sendTasks = new List();
- foreach (ClientInformation currentClient in _clientList.Values)
- {
- sendTasks.Add(_server.SendAsync(message.Buffer, message.Length,
- currentClient.Endpoint));
- }
-
- await Task.WhenAll(sendTasks.ToArray());
- }
- ///
- /// Sends a message to the desired client by its id
- ///
- /// The client id to send the message to
- /// The message to send to the client
- /// The number of bytes sent out
- public async Task SendAsync(short clientId, UdpMessage message)
- {
- if (_clientList.TryGetValue(clientId, out ClientInformation? client))
- {
- return await _server.SendAsync(message.Buffer, message.Length,
- client.Endpoint);
- }
-
- return -1;
- }
- ///
- /// Sends a message to the desired clients by name
- ///
- /// The name of the clients to send messages to
- /// The message to send to the client
- public async Task SendAsync(string clientName, UdpMessage message)
- {
- if (!_clientLookupTable.ContainsKey(clientName))
- {
- return;
- }
-
- List sendTasks = new List();
- foreach (int id in _clientLookupTable[clientName])
- {
- if (_clientList.TryGetValue(id, out ClientInformation? client))
- {
- sendTasks.Add(_server.SendAsync(message.Buffer, message.Length,
- client.Endpoint));
- }
- }
-
- await Task.WhenAll(sendTasks.ToArray());
- }
- ///
- /// Sends a message to all connected clients except for the desired client
- ///
- /// The client id to send the message to
- /// The message to send to the client
- public async Task SendOthersAsync(short clientId, UdpMessage message)
- {
- List sendTasks = new List();
- foreach (ClientInformation currentClient in _clientList.Values)
- {
- if (currentClient.Id == clientId)
- {
- return;
- }
-
- sendTasks.Add(_server.SendAsync(message.Buffer, message.Length,
- currentClient.Endpoint));
- }
-
- await Task.WhenAll(sendTasks.ToArray());
- }
- ///
- /// Sends a message to all connected clients except for the desired client
- ///
- /// The name of the clients to send messages to
- /// The message to send to the client
- public async Task SendOthersAsync(string clientName, UdpMessage message)
- {
- List sendTasks = new List();
- foreach (ClientInformation currentClient in _clientList.Values)
- {
- if (currentClient.Name == clientName)
- {
- continue;
- }
-
- sendTasks.Add(_server.SendAsync(message.Buffer, message.Length,
- currentClient.Endpoint));
- }
-
- await Task.WhenAll(sendTasks.ToArray());
- }
- ///
- /// Attempts to gracefully shut the server down
- ///
- public void Shutdown()
- {
- _cancelTokenSource?.Cancel();
- Dispose();
- }
- ///
- /// Update loop to allow certain systems to be run on a normalized update loop
- ///
- /// The amount of time since the last update call
- public virtual async Task Update(float dt)
- {
- await _clientMonitor.Update(dt);
- }
-
- ///
- /// Sends a message to an unregistered client by its id
- ///
- /// The client endpoint to send the message to
- /// The message to send to the client
- /// The number of bytes sent out
- protected async Task SendToUnknownClientAsync(
- IPEndPoint clientEndpoint, UdpMessage message)
- {
- return await _server.SendAsync(message.Buffer, message.Length,
- clientEndpoint);
- }
- ///
- /// Handles properly disconnecting any stale client connections that did not respond within the Ping window
- ///
- private async Task ClientMonitorOnPingWindowEnded()
- {
- _disconnectionList.Clear();
- foreach (KeyValuePair client in _clientList)
- {
- if (client.Value.IsAlive)
- {
- continue;
- }
-
- UdpMessage toSend =
- new UdpMessage(GlobalUdpMessageTag.ClientDisconnected);
-
- ClientConnectionInformation info =
- new ClientConnectionInformation(client.Value.Name,
- client.Value.Id, false);
-
- UdpWriter writer = toSend.GetWriter();
- writer.Write(info);
- _disconnectionList.Add(info);
- await SendAsync(client.Value.Id, toSend);
- }
-
- foreach (ClientConnectionInformation client in _disconnectionList)
- {
- DisconnectClient(client);
- }
- }
- ///
- /// Handles properly sending PING messages out to all connected clients
- ///
- private async Task ClientMonitorOnPongWindowEnded()
- {
- foreach (KeyValuePair client in _clientList)
- {
- UdpMessage toSend = new UdpMessage(GlobalUdpMessageTag.Ping);
- client.Value.IsAlive = false;
- LogManager
- .LogVerbose($"Sending PING message to client: {client.Value.Name}",
- nameof(NetworkUdpServer));
-
- await SendAsync(client.Value.Id, toSend);
- }
- }
- ///
- /// Helper function used to remove a client entry from the corresponding lookup tables
- ///
- /// The client connection information to use for removal of the client
- private void DisconnectClient(ClientConnectionInformation info)
- {
- if (_clientList.ContainsKey(info.Id) &&
- _clientLookupTable.ContainsKey(_clientList[info.Id].Name))
- {
- _clientLookupTable[_clientList[info.Id].Name].Remove(info.Id);
- }
-
- _clientList.Remove(info.Id);
- ClientDisconnected?.Invoke(this,
- new
- ClientDisconnectedEventArgs(info.Successful,
- info));
-
- LogManager.LogInfo($"{info.Name} disconnected from server",
- nameof(NetworkUdpServer));
- }
- ///
- /// Helper function used to register a connecting client with the server
- ///
- /// The client id that is connecting to determine if the client is a dropped client, or a new client
- /// The endpoint for the client
- /// The connection information for the connecting client
- private async Task ProcessConnectionMessage(
- short clientId, IPEndPoint clientEndpoint,
- ClientConnectionInformation connectInfo)
- {
- short currentId = _clientIdCount++;
- if (_clientList.ContainsKey(clientId))
- {
- if (_clientLookupTable.ContainsKey(_clientList[clientId].Name))
- {
- _clientLookupTable[_clientList[clientId].Name].Remove(clientId);
- }
-
- _clientList.Remove(clientId);
- }
-
- _clientList[currentId] =
- new ClientInformation(currentId, connectInfo.Name, clientEndpoint);
-
- if (!_clientLookupTable.ContainsKey(connectInfo.Name))
- {
- _clientLookupTable[connectInfo.Name] = new List();
- }
-
- _clientLookupTable[connectInfo.Name].Add(currentId);
- LogManager.Log($"{connectInfo.Name} just connected at {clientEndpoint}",
- nameof(NetworkUdpServer));
-
- UdpMessage connectedAck =
- new UdpMessage(GlobalUdpMessageTag.ClientConnected);
-
- ClientConnectionInformation clientAckInfo =
- new ClientConnectionInformation(connectInfo.Name, currentId, true);
-
- connectedAck.GetWriter().Write(clientAckInfo);
- await SendAsync(currentId, connectedAck);
- }
-
- ///
- /// Helper function used to process the incoming udp message
- ///
- /// The incoming udp message to process
- /// The incoming udp result to aid in processing
- private async Task ProcessMessage(UdpMessage message,
- UdpReceiveResult incomingMessage)
- {
- UdpReader reader = message.GetReader();
- switch (message.Tag)
- {
- case (ushort)GlobalUdpMessageTag.ClientConnected:
- {
- ClientConnectionInformation connectionInfo =
- reader.Read();
-
- ClientConnected?.Invoke(this,
- new
- ClientConnectedEventArgs(connectionInfo));
-
- await ProcessConnectionMessage(message.Id,
- incomingMessage.RemoteEndPoint,
- connectionInfo);
-
- break;
- }
- case (ushort)GlobalUdpMessageTag.ClientDisconnected:
- {
- ClientConnectionInformation connectionInfo =
- reader.Read();
-
- DisconnectClient(connectionInfo);
- break;
- }
- case (ushort)GlobalUdpMessageTag.Pong:
- if (_clientList.TryGetValue(message.Id,
- out ClientInformation? client))
- {
- LogManager
- .LogVerbose($"Received PONG from client: {message.Id}",
- nameof(NetworkUdpServer));
-
- client.IsAlive = true;
- }
- else
- {
- await
- SendToUnknownClientAsync(incomingMessage.RemoteEndPoint,
- new
- UdpMessage(GlobalUdpMessageTag
- .UnknownClient));
- }
-
- break;
- default:
- {
- if (!_clientList.ContainsKey(message.Id))
- {
- await
- SendToUnknownClientAsync(incomingMessage.RemoteEndPoint,
- new
- UdpMessage(GlobalUdpMessageTag
- .UnknownClient));
-
- LogManager
- .LogError("Message from unknown client received, discarding message...",
- nameof(NetworkUdpServer));
- }
- else
- {
- MessageReceived?.Invoke(this,
- new UdpMessageEventArgs(message));
- }
-
- break;
- }
- }
- }
-}
\ No newline at end of file
diff --git a/Networking/Udp/UdpMessage.cs b/Networking/Udp/UdpMessage.cs
deleted file mode 100644
index e702ccd..0000000
--- a/Networking/Udp/UdpMessage.cs
+++ /dev/null
@@ -1,104 +0,0 @@
-using System.Net.Sockets;
-using FluffyVoid.Utilities;
-
-namespace FluffyVoid.Networking.Udp;
-
-///
-/// Utility class used to read and write a udp network stream to a dev friendly packet
-///
-public class UdpMessage : INetworkMessage
-{
- ///
- /// The buffer mode to assign to the message, helps to prevent trying to read from a write buffer and vice-versa
- ///
- private readonly MessageBufferMode _bufferMode;
- ///
- /// The udp stream created for this buffer based on the buffer mode
- ///
- private readonly UdpStream _stream;
-
- ///
- /// Size of the network buffer
- ///
- public static ushort BufferSize { get; set; } = 512;
-
- ///
- /// Reference to the streams byte buffer
- ///
- public byte[] Buffer => _stream.Buffer;
- ///
- /// Id of the client sending the message
- ///
- public short Id { get; }
- ///
- /// The number of bytes in the stream buffer
- ///
- public int Length => _stream.Length;
- ///
- /// The tag assigned to the message
- ///
- public ushort Tag { get; }
-
- ///
- /// Constructor used to builds a message for use in writing to the network stream
- ///
- /// The tag to assign to the message
- public UdpMessage(ushort tag)
- {
- Tag = tag;
- _stream = new UdpWriter(BufferSize);
- _bufferMode = MessageBufferMode.Write;
- GetWriter().WriteShort(Id);
- GetWriter().WriteUshort(Tag);
- }
- ///
- /// Constructor used to builds a message for use in writing to the network stream
- ///
- /// The tag to assign to the message
- public UdpMessage(Enum tag)
- {
- Tag = tag.ToUshort();
- _stream = new UdpWriter(BufferSize);
- _bufferMode = MessageBufferMode.Write;
- GetWriter().WriteShort(Id);
- GetWriter().WriteUshort(Tag);
- }
- ///
- /// Constructor used to build a message for reading from the network stream
- ///
- /// Reference to the udp result
- public UdpMessage(UdpReceiveResult udpStream)
- {
- _stream = new UdpReader(udpStream.Buffer, udpStream.Buffer.Length);
- _bufferMode = MessageBufferMode.Read;
- Id = GetReader().ReadShort();
- Tag = GetReader().ReadUshort();
- }
-
- ///
- /// Returns the reader assigned to this message for use in reading variables from the network stream
- ///
- /// The assigned reader if the message is in Read mode, otherwise an empty reader
- public UdpReader GetReader()
- {
- if (_stream is UdpReader reader)
- {
- return reader;
- }
-
- return new UdpReader(_bufferMode);
- }
- ///
- /// Returns the writer assigned to this message for use in writing variables to the network stream
- ///
- /// The assigned writer if the message is in Write mode, otherwise an empty writer
- public UdpWriter GetWriter()
- {
- if (_stream is UdpWriter writer)
- {
- return writer;
- }
-
- return new UdpWriter(_bufferMode);
- }
-}
\ No newline at end of file
diff --git a/Networking/Udp/UdpReader.cs b/Networking/Udp/UdpReader.cs
deleted file mode 100644
index a9990e4..0000000
--- a/Networking/Udp/UdpReader.cs
+++ /dev/null
@@ -1,287 +0,0 @@
-using System.Text;
-using FluffyVoid.Logging;
-
-namespace FluffyVoid.Networking.Udp;
-
-///
-/// Udp reader class used to read values directly from a network byte stream
-///
-public class UdpReader : UdpStream
-{
- ///
- /// Default constructor for initializing the udp reader
- ///
- /// The buffer to be read by the reader
- /// The length of the buffer
- public UdpReader(byte[] buffer, int bufferLength)
- {
- Position = 0;
- Length = bufferLength;
- Buffer = buffer;
- BufferMode = MessageBufferMode.Read;
- }
- ///
- /// Constructor used to initialize an empty reader
- ///
- /// The buffer mode of the udp message
- public UdpReader(MessageBufferMode bufferMode = MessageBufferMode.Read)
- {
- Position = Length = 0;
- Buffer = [];
- BufferMode = bufferMode;
- }
- ///
- /// Reads a custom serializable class from the network stream
- ///
- public T Read()
- where T : IUdpSerializable
- {
- T value = Activator.CreateInstance();
- value.Deserialize(new UdpDeserializerEventArgs(this));
- return value;
- }
- ///
- /// Reads a single bool from the network stream
- ///
- /// The bool value from the network stream if successful, otherwise false
- public bool ReadBool()
- {
- if (ReadFromBuffer(out byte[] itemBuffer, sizeof(bool)) > 0)
- {
- return BitConverter.ToBoolean(itemBuffer.ToArray(), 0);
- }
-
- LogManager.LogError("Unable to read Bool from the buffer",
- nameof(UdpReader));
-
- return false;
- }
-
- ///
- /// Reads a single byte from the network stream
- ///
- /// The byte value from the network stream if successful, otherwise 0
- public byte ReadByte()
- {
- if (ReadFromBuffer(out byte[] itemBuffer, sizeof(byte)) > 0)
- {
- return itemBuffer.ToArray()[0];
- }
-
- LogManager.LogError("Unable to read Byte from the buffer",
- nameof(UdpReader));
-
- return 0;
- }
- ///
- /// Reads a single char from the network stream
- ///
- /// The char value from the network stream if successful, otherwise 'a'
- public char ReadChar()
- {
- if (ReadFromBuffer(out byte[] itemBuffer, sizeof(char)) > 0)
- {
- return BitConverter.ToChar(itemBuffer.ToArray(), 0);
- }
-
- LogManager.LogError("Unable to read Char from the buffer",
- nameof(UdpReader));
-
- return 'a';
- }
- ///
- /// Reads a single double from the network stream
- ///
- /// The double value from the network stream if successful, otherwise 0
- public double ReadDouble()
- {
- if (ReadFromBuffer(out byte[] itemBuffer, sizeof(double)) > 0)
- {
- return BitConverter.ToDouble(itemBuffer.ToArray(), 0);
- }
-
- LogManager.LogError("Unable to read Double from the buffer",
- nameof(UdpReader));
-
- return 0;
- }
- ///
- /// Reads a single float from the network stream
- ///
- /// The float value from the network stream if successful, otherwise 0
- public float ReadFloat()
- {
- if (ReadFromBuffer(out byte[] itemBuffer, sizeof(float)) > 0)
- {
- return BitConverter.ToSingle(itemBuffer.ToArray(), 0);
- }
-
- LogManager.LogError("Unable to read Float from the buffer",
- nameof(UdpReader));
-
- return 0;
- }
- ///
- /// Reads a single int from the network stream
- ///
- /// The int value from the network stream if successful, otherwise 0
- public int ReadInt()
- {
- if (ReadFromBuffer(out byte[] itemBuffer, sizeof(int)) > 0)
- {
- return BitConverter.ToInt32(itemBuffer.ToArray(), 0);
- }
-
- LogManager.LogError("Unable to read Int from the buffer",
- nameof(UdpReader));
-
- return 0;
- }
- ///
- /// Reads a custom serializable class from the network stream
- ///
- /// The class to read
- public void ReadInto(ref T? value)
- where T : IUdpSerializable
- {
- value ??= Read();
- value.Deserialize(new UdpDeserializerEventArgs(this));
- }
- ///
- /// Reads a single long from the network stream
- ///
- /// The long value from the network stream if successful, otherwise 0
- public long ReadLong()
- {
- if (ReadFromBuffer(out byte[] itemBuffer, sizeof(long)) > 0)
- {
- return BitConverter.ToInt64(itemBuffer.ToArray(), 0);
- }
-
- LogManager.LogError("Unable to read Long from the buffer",
- nameof(UdpReader));
-
- return 0;
- }
- ///
- /// Reads a single short from the network stream
- ///
- /// The short value from the network stream if successful, otherwise 0
- public short ReadShort()
- {
- if (ReadFromBuffer(out byte[] itemBuffer, sizeof(short)) > 0)
- {
- return BitConverter.ToInt16(itemBuffer.ToArray(), 0);
- }
-
- LogManager.LogError("Unable to read Short from the buffer",
- nameof(UdpReader));
-
- return 0;
- }
- ///
- /// Reads a string from the network stream
- ///
- /// The string value from the network stream if successful, otherwise ""
- public string ReadString()
- {
- ushort bufferLength = ReadUshort();
- if (bufferLength <= 0)
- {
- return "";
- }
-
- if (ReadFromBuffer(out byte[] itemBuffer, bufferLength) > 0)
- {
- return Encoding.ASCII.GetString(itemBuffer.ToArray(), 0,
- bufferLength);
- }
-
- return "";
- }
- ///
- /// Reads a single uint from the network stream
- ///
- /// The uint value from the network stream if successful, otherwise 0
- public uint ReadUint()
- {
- if (ReadFromBuffer(out byte[] itemBuffer, sizeof(uint)) > 0)
- {
- return BitConverter.ToUInt32(itemBuffer.ToArray(), 0);
- }
-
- LogManager.LogError("Unable to read Uint from the buffer",
- nameof(UdpReader));
-
- return 0;
- }
- ///
- /// Reads a single ulong from the network stream
- ///
- /// The ulong value from the network stream if successful, otherwise 0
- public ulong ReadUlong()
- {
- if (ReadFromBuffer(out byte[] itemBuffer, sizeof(ulong)) > 0)
- {
- return BitConverter.ToUInt64(itemBuffer.ToArray(), 0);
- }
-
- LogManager.LogError("Unable to read Ulong from the buffer",
- nameof(UdpReader));
-
- return 0;
- }
- ///
- /// Reads a single ushort from the network stream
- ///
- /// The ushort value from the network stream if successful, otherwise 0
- public ushort ReadUshort()
- {
- if (ReadFromBuffer(out byte[] itemBuffer, sizeof(ushort)) > 0)
- {
- return BitConverter.ToUInt16(itemBuffer.ToArray(), 0);
- }
-
- LogManager.LogError("Unable to read Ushort from the buffer",
- nameof(UdpReader));
-
- return 0;
- }
-
- ///
- /// Helper function used to verify the BufferMode has been set to Read, as well as reading within the bounds of the
- /// stream
- ///
- /// The byte buffer for the requested variable
- /// The number of bytes to read from the network buffer
- /// The number of bytes successfully read from the buffer
- private int ReadFromBuffer(out byte[] itemBuffer, int readLength)
- {
- if (BufferMode != MessageBufferMode.Read)
- {
- LogManager
- .LogError("Attempting to read from a buffer not assigned for reading",
- nameof(UdpReader));
-
- itemBuffer = [];
- return -1;
- }
-
- if (Position + readLength <= Length)
- {
- itemBuffer = BitConverter.IsLittleEndian && readLength > 1
- ? Buffer.Skip(Position).Take(readLength).Reverse().ToArray()
- : Buffer.Skip(Position).Take(readLength).ToArray();
-
- Position += readLength;
- return readLength;
- }
-
- LogManager
- .LogError($"Attempting to read {Position + readLength - Length} bytes past the end of the message buffer",
- nameof(UdpReader));
-
- itemBuffer = [];
- return -1;
- }
-}
\ No newline at end of file
diff --git a/Networking/Udp/UdpWriter.cs b/Networking/Udp/UdpWriter.cs
deleted file mode 100644
index 18c8807..0000000
--- a/Networking/Udp/UdpWriter.cs
+++ /dev/null
@@ -1,221 +0,0 @@
-using System.Text;
-using FluffyVoid.Logging;
-
-namespace FluffyVoid.Networking.Udp;
-
-///
-/// Udp writer class used to read values directly from a network byte stream
-///
-public class UdpWriter : UdpStream
-{
- ///
- /// Maximum size of the message buffer
- ///
- private readonly ushort _maximumMessageBufferSize;
-
- ///
- /// Default constructor for initializing the udp writer
- ///
- /// The max size of the network stream
- public UdpWriter(ushort bufferSize)
- {
- _maximumMessageBufferSize = bufferSize;
- Position = Length = 0;
- Buffer = new byte[_maximumMessageBufferSize];
- BufferMode = MessageBufferMode.Write;
- }
- ///
- /// Constructor used to initialize an empty writer
- ///
- ///
- public UdpWriter(MessageBufferMode bufferMode = MessageBufferMode.Write)
- {
- _maximumMessageBufferSize = 0;
- Position = Length = 0;
- Buffer = [];
- BufferMode = bufferMode;
- }
- ///
- /// Writes a custom serializable class to the network stream
- ///
- /// The class to write
- public int Write(T value)
- where T : IUdpSerializable
- {
- return value.Serialize(new UdpSerializerEventArgs(this));
- }
- ///
- /// Writes a single bool to the network stream
- ///
- /// The bool value to write
- public int WriteBool(bool value)
- {
- return WriteToBuffer(BitConverter.GetBytes(value));
- }
-
- ///
- /// Writes a single byte to the network stream
- ///
- /// The byte value to write
- public int WriteByte(byte value)
- {
- return WriteToBuffer([value]);
- }
- ///
- /// Writes a single char to the network stream
- ///
- /// The char value to write
- public int WriteChar(char value)
- {
- return WriteToBuffer(BitConverter.GetBytes(value));
- }
- ///
- /// Writes a single double to the network stream
- ///
- /// The double value to write
- public int WriteDouble(double value)
- {
- return WriteToBuffer(BitConverter.GetBytes(value));
- }
- ///
- /// Writes a single float to the network stream
- ///
- /// The float value to write
- public int WriteFloat(float value)
- {
- return WriteToBuffer(BitConverter.GetBytes(value));
- }
- ///
- /// Writes a single int to the network stream
- ///
- /// The int value to write
- public int WriteInt(int value)
- {
- return WriteToBuffer(BitConverter.GetBytes(value));
- }
- ///
- /// Writes a single long to the network stream
- ///
- /// The long value to write
- public int WriteLong(long value)
- {
- return WriteToBuffer(BitConverter.GetBytes(value));
- }
- ///
- /// writes a raw byte buffer at the desired location within the stream
- ///
- /// The byte buffer for the requested variable to be written to the stream
- /// The starting position to write the byte buffer
- /// The number of bytes successfully written to the stream
- public int WriteRaw(byte[] itemBuffer, int itemPosition)
- {
- if (BufferMode != MessageBufferMode.Write)
- {
- LogManager
- .LogError("Attempting to write to a buffer not assigned for writing",
- nameof(UdpWriter));
-
- return -1;
- }
-
- if (itemPosition + itemBuffer.Length < _maximumMessageBufferSize)
- {
- if (BitConverter.IsLittleEndian && itemBuffer.Length > 1)
- {
- itemBuffer = itemBuffer.Reverse().ToArray();
- }
-
- itemBuffer.CopyTo(Buffer, itemPosition);
- if (itemPosition + itemBuffer.Length > Length)
- {
- Length = itemPosition + itemBuffer.Length;
- }
-
- return itemBuffer.Length;
- }
-
- LogManager
- .LogError($"Attempting to write {Length + itemBuffer.Length - _maximumMessageBufferSize} bytes past the end of the buffer",
- nameof(UdpWriter));
-
- return -1;
- }
- ///
- /// Writes a single short to the network stream
- ///
- /// The short value to write
- public int WriteShort(short value)
- {
- return WriteToBuffer(BitConverter.GetBytes(value));
- }
- ///
- /// Writes a string to the network stream
- ///
- /// The string value to write
- public int WriteString(string value)
- {
- int count = WriteToBuffer(BitConverter.GetBytes((ushort)value.Length));
- count += WriteToBuffer(Encoding.ASCII.GetBytes(value));
- return count;
- }
- ///
- /// Writes a single uint to the network stream
- ///
- /// The uint value to write
- public int WriteUint(uint value)
- {
- return WriteToBuffer(BitConverter.GetBytes(value));
- }
- ///
- /// Writes a single ulong to the network stream
- ///
- /// The ulong value to write
- public int WriteUlong(ulong value)
- {
- return WriteToBuffer(BitConverter.GetBytes(value));
- }
- ///
- /// Writes a single ushort to the network stream
- ///
- /// The ushort value to write
- public int WriteUshort(ushort value)
- {
- return WriteToBuffer(BitConverter.GetBytes(value));
- }
-
- ///
- /// Helper function used to verify the BufferMode has been set to Write, as well as writing within the bounds of the
- /// stream
- ///
- /// The byte buffer for the requested variable to be written to the stream
- /// The number of bytes successfully written to the stream
- private int WriteToBuffer(byte[] itemBuffer)
- {
- if (BufferMode != MessageBufferMode.Write)
- {
- LogManager
- .LogError("Attempting to write to a buffer not assigned for writing",
- nameof(UdpWriter));
-
- return -1;
- }
-
- if (Length + itemBuffer.Length < _maximumMessageBufferSize)
- {
- if (BitConverter.IsLittleEndian && itemBuffer.Length > 1)
- {
- itemBuffer = itemBuffer.Reverse().ToArray();
- }
-
- itemBuffer.CopyTo(Buffer, Length);
- Length += itemBuffer.Length;
- return itemBuffer.Length;
- }
-
- LogManager
- .LogError($"Attempting to write {Length + itemBuffer.Length - _maximumMessageBufferSize} bytes past the end of the buffer",
- nameof(UdpWriter));
-
- return -1;
- }
-}
\ No newline at end of file
diff --git a/Networking/Udp/UpdStream.cs b/Networking/Udp/UpdStream.cs
deleted file mode 100644
index 93bd1ed..0000000
--- a/Networking/Udp/UpdStream.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-namespace FluffyVoid.Networking.Udp;
-
-///
-/// Base class for udp streams
-///
-public abstract class UdpStream
-{
- ///
- /// The byte buffer the stream uses to operate on the network stream
- ///
- public byte[] Buffer { get; protected set; } = null!;
- ///
- /// The length of the byte buffer
- ///
- public int Length { get; protected set; }
- ///
- /// The buffer mode the stream has been set to
- ///
- protected MessageBufferMode BufferMode { get; set; }
- ///
- /// The current position of the pointer in the buffer
- ///
- protected int Position { get; set; }
-}
\ No newline at end of file
diff --git a/Networking/Web/WebClient.cs b/Networking/Web/WebClient.cs
deleted file mode 100644
index 489f866..0000000
--- a/Networking/Web/WebClient.cs
+++ /dev/null
@@ -1,169 +0,0 @@
-using System.Net;
-using FluffyVoid.Logging;
-using FluffyVoid.Utilities;
-
-namespace FluffyVoid.Networking.Web;
-
-///
-/// Rest capable client that can communicate with an HTTP endpoint
-///
-public class WebClient
-{
- ///
- /// Singleton instance to aid in keeping a single http client no matter how many the project tries to create
- ///
- private static volatile HttpClient? s_instance;
- ///
- /// Backoff table that retries a request with exponential delays
- ///
- private readonly int[] _retryBackoffTable =
- [
- 0,
- 1000,
- 2000,
- 4000
- ];
-
- ///
- /// Instance variable for the singleton that ensures the singleton is always created
- ///
- protected static HttpClient Instance
- {
- get
- {
- if (s_instance == null)
- {
- s_instance = new HttpClient();
- }
-
- return s_instance;
- }
- }
- ///
- /// Event to notify that a request has failed due to not having proper authorization
- ///
- public event EventHandler? AuthorizationFailed;
-
- ///
- /// Downloads a file from the requested URL and saves it at the desired filepath location
- ///
- /// The URL to download the file from
- /// The filepath to save the file to locally
- public async Task DownloadFileAsync(string url, string filePath)
- {
- if (string.IsNullOrEmpty(url) || string.IsNullOrEmpty(filePath))
- {
- LogManager
- .LogError($"Unable to download file, URL or FilePath not set\nURL={url}\nFilePath={filePath}",
- nameof(WebClient));
-
- return;
- }
-
- try
- {
- await using Stream urlStream = await Instance.GetStreamAsync(url);
- string? directory = Path.GetDirectoryName(filePath);
- if (!string.IsNullOrEmpty(directory) &&
- !Directory.Exists(directory))
- {
- Directory.CreateDirectory(directory);
- }
-
- await using FileStream writer =
- new FileStream(filePath, FileMode.OpenOrCreate);
-
- await urlStream.CopyToAsync(writer);
- }
- catch (Exception e)
- {
- LogManager.LogException($"Failed to download file from {url}",
- nameof(WebClient), ex: e);
- }
- }
-
- ///
- /// Sends a web request to its external HTTP endpoint
- ///
- /// The web message data to send out
- public async Task SendRequestAsync(WebMessage message)
- {
- try
- {
- using HttpResponseMessage response =
- await Instance.SendAsync(message.Request);
-
- switch (response.StatusCode)
- {
- case HttpStatusCode.OK:
- case HttpStatusCode.NoContent:
- case HttpStatusCode.Accepted:
- case HttpStatusCode.Redirect:
- try
- {
- message.Process(response,
- await response.Content
- .ReadAsStringAsync());
-
- message.Dispose();
- }
- catch (Exception ex)
- {
- LogManager
- .LogException($"Failed to process the response sent to {message.Request.RequestUri}",
- nameof(WebClient), ex: ex);
- }
-
- break;
- case HttpStatusCode.Unauthorized:
- if (_retryBackoffTable.InBounds(message.FailureCount++))
- {
- string reason =
- await response.Content.ReadAsStringAsync();
-
- LogManager
- .LogError($"Oauth token has expired: {reason}, attempting to reauthenticate.",
- nameof(WebClient));
-
- AuthorizationFailed?.Invoke(Instance, message);
- }
- else
- {
- LogManager
- .LogWarning($"Authorization check has failed {message.FailureCount} time(s). Manual reauthorization is required.",
- nameof(WebClient));
- }
-
- break;
- case HttpStatusCode.RequestTimeout:
- if (_retryBackoffTable.InBounds(message.FailureCount))
- {
- await Task.Delay(_retryBackoffTable
- [message.FailureCount++]);
-
- await SendRequestAsync(message);
- }
- else
- {
- LogManager
- .LogWarning($"{Instance.BaseAddress} is unreachable after {message.FailureCount} attempt(s). Please try again later",
- nameof(WebClient));
- }
-
- break;
- default:
- LogManager
- .Log($"Received HTTP status code of {response.StatusCode} with Content {await response.Content.ReadAsStringAsync()}. Unsure how to handle that code",
- nameof(WebClient));
-
- break;
- }
- }
- catch (Exception ex)
- {
- LogManager
- .LogException($"Failed to send {message.Request.Method} message to {message.Request.RequestUri}",
- nameof(WebClient), ex: ex);
- }
- }
-}
\ No newline at end of file
diff --git a/Networking/Web/WebClientMessage.cs b/Networking/Web/WebClientMessage.cs
deleted file mode 100644
index 2fb2fd9..0000000
--- a/Networking/Web/WebClientMessage.cs
+++ /dev/null
@@ -1,141 +0,0 @@
-namespace FluffyVoid.Networking.Web;
-
-///
-/// Message class used to send HTTP messages to their endpoint
-///
-public class WebClientMessage : WebMessage
-{
- ///
- /// Request callback that will be called when the message has received a response back
- ///
- public event Action? Callback;
-
- ///
- /// Constructor used to initialize the message
- ///
- public WebClientMessage()
- {
- }
- ///
- /// Constructor used to initialize the message
- ///
- /// The HTTP delivery method
- /// The url endpoint for the message
- public WebClientMessage(WebMethod method, string url)
- : base(method, url)
- {
- }
- ///
- /// Constructor used to initialize the message
- ///
- /// The HTTP delivery method
- /// The url endpoint for the message
- /// A custom id to assign to the message
- public WebClientMessage(WebMethod method, string url, int requestId)
- : base(method, url, requestId)
- {
- }
- ///
- /// Copy constructor that can build a copy of the message but updates the HTTP request properly
- ///
- /// The request to use in building the message
- /// The callback to assign to the message
- /// The current number of failed attempts for this message
- protected WebClientMessage(HttpRequestMessage request,
- Action? callback, int failureCount)
- {
- FailureCount = failureCount;
- Request = request.Clone();
- Callback = callback;
- }
-
- ///
- /// Deep copies the message and returns the copy
- ///
- /// The deeply copied web message
- public override WebMessage DeepClone()
- {
- return new WebClientMessage(Request, Callback, FailureCount);
- }
- ///
- /// Processes the message response when the endpoint returns its reply
- ///
- /// The http message that was received
- /// The content of the message
- public override void Process(HttpResponseMessage message, string payload)
- {
- Callback?.Invoke(RequestId, payload);
- }
-}
-///
-/// Message class used to send HTTP messages to their endpoint
-///
-public class WebClientMessage : WebMessage
- where T : Enum
-{
- ///
- /// Request callback that will be called when the message has received a response back
- ///
- public event Action? Callback;
-
- ///
- /// Constructor used to initialize the message
- ///
- public WebClientMessage()
- {
- }
- ///
- /// Constructor used to initialize the message
- ///
- /// The HTTP delivery method
- /// The url endpoint for the message
- public WebClientMessage(WebMethod method, string url)
- : base(method, url)
- {
- }
- ///
- /// Constructor used to initialize the message
- ///
- /// The HTTP delivery method
- /// The url endpoint for the message
- /// A custom id to assign to the message
- public WebClientMessage(WebMethod method, string url, int requestId)
- : base(method, url, requestId)
- {
- }
- ///
- /// Copy constructor that can build a copy of the message but updates the HTTP request properly
- ///
- /// The request to use in building the message
- /// The callback to assign to the message
- /// The api identity/type of message when using multiple apis
- /// The current number of failed attempts for this message
- protected WebClientMessage(HttpRequestMessage request,
- Action? callback, T? identity,
- int failureCount)
- {
- FailureCount = failureCount;
- Request = request.Clone();
- Callback = callback;
- Identity = identity;
- }
-
- ///
- /// Deep copies the message and returns the copy
- ///
- /// The deeply copied web message
- public override WebMessage DeepClone()
- {
- return new WebClientMessage(Request, Callback, Identity,
- FailureCount);
- }
- ///
- /// Processes the message response when the endpoint returns its reply
- ///
- /// The http message that was received
- /// The content of the message
- public override void Process(HttpResponseMessage message, string payload)
- {
- Callback?.Invoke(RequestId, payload);
- }
-}
\ No newline at end of file
diff --git a/Networking/Web/WebMessage.cs b/Networking/Web/WebMessage.cs
deleted file mode 100644
index 5389454..0000000
--- a/Networking/Web/WebMessage.cs
+++ /dev/null
@@ -1,292 +0,0 @@
-using System.Net.Http.Headers;
-using System.Text;
-using FluffyVoid.Logging;
-using FluffyVoid.Utilities;
-using FluffyVoid.Utilities.Cloneable;
-
-namespace FluffyVoid.Networking.Web;
-
-///
-/// Base class for all HTTP web messages
-///
-public class WebMessage : IDisposable, IDeepCloneable
-{
- ///
- /// The number of failure attempts for the message
- ///
- public int FailureCount { get; set; }
- ///
- /// The cached HTTP request message
- ///
- public HttpRequestMessage Request { get; protected set; }
- ///
- /// The id of the request
- ///
- public int RequestId { get; set; }
-
- ///
- /// Constructor that does no initialization, for use by inherited classes when wanting to do full initialization at
- /// that level
- ///
- public WebMessage()
- {
- Request = null!;
- }
- ///
- /// Constructor used to initialize the web message
- ///
- /// The HTTP delivery method
- /// The url endpoint for the message
- /// A custom id to assign to the message
- public WebMessage(WebMethod method, string url, int requestId = -1)
- {
- FailureCount = 0;
- RequestId = requestId;
- Request =
- new HttpRequestMessage(new HttpMethod(method.ToString()), url);
- }
- ///
- /// Constructor used to initialize the web message
- ///
- /// The HTTP request to store in the web message
- /// The number of failure attempts for the message
- /// A custom id to assign to the message
- protected WebMessage(HttpRequestMessage request, int failureCount,
- int requestId = -1)
- {
- FailureCount = failureCount;
- RequestId = requestId;
- Request = request.Clone();
- }
-
- ///
- /// Adds an authorization header to the web message
- ///
- /// The authorization type to use
- /// The value for the authorization header
- public virtual void AddAuthorizationHeader(AuthorizationType type,
- string value)
- {
- switch (type)
- {
- case AuthorizationType.Basic:
- {
- string base64EncodedAuthenticationString =
- Convert.ToBase64String(Encoding.ASCII.GetBytes(value));
-
- Request.Headers.Authorization =
- new AuthenticationHeaderValue(type.GetDescription(),
- base64EncodedAuthenticationString);
-
- break;
- }
- case AuthorizationType.Bearer:
- {
- Request.Headers.Authorization =
- new AuthenticationHeaderValue(type.GetDescription(), value);
-
- break;
- }
- default:
- {
- LogManager
- .LogWarning($"Unhandled authorization type [{type}], manual header assignment required until implemented",
- nameof(WebMessage));
-
- break;
- }
- }
- }
-
- ///
- /// Adds the passed in content to the message with the desired content type
- ///
- /// The content to set as the payload
- /// The content type to set the payload as
- public virtual void AddContent(string content, ContentType type)
- {
- AddContent(content, type, Encoding.UTF8);
- }
- ///
- /// Adds the passed in content to the message with the desired content type and encoding style
- ///
- /// The content to set as the payload
- /// The content type to set the payload as
- /// The encoding to use when setting the content
- public virtual void AddContent(string content, ContentType type,
- Encoding contentEncoding)
- {
- Request.Content =
- new StringContent(content, contentEncoding, type.GetDescription());
- }
- ///
- /// Adds a header KVP to the message
- ///
- /// The key of the header
- /// The value of the header
- public virtual void AddHeader(string key, string value)
- {
- Request.Headers.TryAddWithoutValidation(key, value);
- }
- ///
- /// Adds a User-Agent header to the web message
- ///
- /// The name of the product
- /// The version of the product
- /// The description, enclosed by (), of the product
- public virtual void AddUserAgent(string name, string version,
- string comment)
- {
- Request.Headers.UserAgent
- .Add(new ProductInfoHeaderValue(name, version));
-
- Request.Headers.UserAgent.Add(new ProductInfoHeaderValue(comment));
- }
- ///
- /// Deeply clones the message and returns a copy
- ///
- /// The deeply copied version of this message
- public virtual WebMessage DeepClone()
- {
- return new WebMessage(Request, FailureCount, RequestId);
- }
- ///
- /// Disposes of any resources the message has created
- ///
- public virtual void Dispose()
- {
- Request.Dispose();
- }
-
- ///
- /// Initializes the WebMessage with values needed to send a request
- ///
- /// The HTTP delivery method
- /// The url endpoint for the message
- /// A custom id to assign to the message
- public virtual void Initialize(WebMethod method, string url,
- int requestId = -1)
- {
- FailureCount = 0;
- RequestId = requestId;
- Request =
- new HttpRequestMessage(new HttpMethod(method.ToString()), url);
- }
- ///
- /// Processes the message response when the endpoint returns its reply
- ///
- /// The http message that was received
- /// The content of the message
- public virtual void Process(HttpResponseMessage message, string payload)
- {
- LogManager
- .LogInfo($"Received response {message.StatusCode}:{message.ReasonPhrase} from [{message.RequestMessage?.RequestUri}]: {payload}",
- nameof(WebMessage));
- }
- ///
- /// Removes a header KVP from the message by key
- ///
- /// The key of the header to remove
- /// True if the header was successfully removed, otherwise false
- public bool RemoveHeader(string key)
- {
- return Request.Headers.Remove(key);
- }
- ///
- /// Updates an existing header KVP with the new KVP passed in
- ///
- /// The key of the header to replace
- /// The new value of the header
- public void UpdateHeader(string key, string value)
- {
- RemoveHeader(key);
- AddHeader(key, value);
- }
- ///
- /// Deeply clones the message and returns a copy
- ///
- /// The deeply copied version of this message
- object IDeepCloneable.DeepClone()
- {
- return DeepClone();
- }
-}
-///
-/// Base class for all HTTP web messages with different oauth points
-///
-public class WebMessage : WebMessage
- where T : Enum
-{
- ///
- /// The api identity/type of message when using multiple apis
- ///
- public T? Identity { get; set; }
-
- ///
- /// Constructor that does no initialization, for use by inherited classes when wanting to do full initialization at
- /// that level
- ///
- public WebMessage()
- {
- Identity = default;
- }
- ///
- /// Constructor used to initialize the web message
- ///
- /// The HTTP delivery method
- /// The url endpoint for the message
- /// A custom id to assign to the message
- public WebMessage(WebMethod method, string url, int requestId = -1)
- : base(method, url, requestId)
- {
- Identity = default;
- }
- ///
- /// Constructor used to initialize the web message
- ///
- /// The HTTP delivery method
- /// The url endpoint for the message
- /// The api identity/type of message when using multiple apis
- /// A custom id to assign to the message
- public WebMessage(WebMethod method, string url, T? identity,
- int requestId = -1)
- : base(method, url, requestId)
- {
- Identity = identity;
- }
- ///
- /// Constructor used to initialize the web message
- ///
- /// The HTTP request to store in the web message
- /// The api identity/type of message when using multiple apis
- /// The number of failure attempts for the message
- /// A custom id to assign to the message
- protected WebMessage(HttpRequestMessage request, T? identity,
- int failureCount, int requestId = -1)
- : base(request, failureCount, requestId)
- {
- Identity = identity;
- }
-
- ///
- /// Deeply clones the message and returns a copy
- ///
- /// The deeply copied version of this message
- public override WebMessage DeepClone()
- {
- return new WebMessage(Request, Identity, FailureCount, RequestId);
- }
- ///
- /// Initializes the WebMessage with values needed to send a request
- ///
- /// The HTTP delivery method
- /// The url endpoint for the message
- /// The api identity/type of message when using multiple apis
- /// A custom id to assign to the message
- public void Initialize(WebMethod method, string url, T identity,
- int requestId = -1)
- {
- base.Initialize(method, url, requestId);
- Identity = identity;
- }
-}
\ No newline at end of file
diff --git a/Networking/Web/WebServer.cs b/Networking/Web/WebServer.cs
deleted file mode 100644
index ccc05b7..0000000
--- a/Networking/Web/WebServer.cs
+++ /dev/null
@@ -1,271 +0,0 @@
-using System.Net;
-using System.Net.WebSockets;
-using FluffyVoid.Logging;
-using FluffyVoid.Utilities;
-
-namespace FluffyVoid.Networking.Web;
-
-///
-/// Server class for listening for HTTP based messaging
-///
-public class WebServer
-{
- ///
- /// Cancellation token to use when shutting down the client
- ///
- private readonly CancellationTokenSource? _cancelTokenSource;
- ///
- /// The http listener for the web server
- ///
- private readonly HttpListener _httpListener;
- ///
- /// Lock object used to ensure that the queue stays thread safe
- ///
- private readonly object _requestLock;
- ///
- /// the queue of request message received
- ///
- private readonly Queue _requestMessages;
-
- ///
- /// Whether the server is currently listening for network traffic or not
- ///
- public bool IsListening { get; private set; }
- ///
- /// Event used to notify listeners that a DELETE request has just been received
- ///
-
- // ReSharper disable once InconsistentNaming
- public event EventHandler? DELETEMessageReceived;
- ///
- /// Event used to notify listeners that a GET request has just been received
- ///
-
- // ReSharper disable once InconsistentNaming
- public event EventHandler? GETMessageReceived;
- ///
- /// Event used to notify listeners that a PATCH request has just been received
- ///
-
- // ReSharper disable once InconsistentNaming
- public event EventHandler? PATCHMessageReceived;
- ///
- /// Event used to notify listeners that a POST request has just been received
- ///
-
- // ReSharper disable once InconsistentNaming
- public event EventHandler? POSTMessageReceived;
- ///
- /// Event used to notify listeners that a PUT request has just been received
- ///
-
- // ReSharper disable once InconsistentNaming
- public event EventHandler? PUTMessageReceived;
- ///
- /// Event used to notify listeners that a new web socket client has connected to the server
- ///
- public event EventHandler?
- WebSocketClientConnected;
-
- ///
- /// Constructor used to set up the listening prefixes for the HTTP server
- ///
- /// The list of http prefixes to bind to
- public WebServer(string[] prefixes)
- {
- _requestMessages = new Queue();
- _requestLock = new object();
- _httpListener = new HttpListener();
- _cancelTokenSource = new CancellationTokenSource();
- foreach (string prefix in prefixes)
- {
- _httpListener.Prefixes.Add(prefix);
- }
- }
- ///
- /// Closes the server and releases all resources
- ///
- public virtual void Dispose()
- {
- _cancelTokenSource?.Dispose();
- _httpListener.Stop();
- }
- ///
- /// Listen loop used to allow the server to listen for network traffic without blocking the main thread
- ///
- public async Task ListenAsync()
- {
- if (_cancelTokenSource == null)
- {
- return;
- }
-
- try
- {
- _httpListener.Start();
- }
- catch (HttpListenerException ex)
- {
- LogManager.LogException("Failed to start server", nameof(WebServer),
- ex: ex);
- }
- catch (Exception ex)
- {
- LogManager
- .LogException("Server threw an exception while starting the http listener",
- nameof(WebServer), ex: ex);
- }
-
- IsListening = true;
- do
- {
- try
- {
- HttpListenerContext context =
- await
- Task.Run(() => _httpListener.GetContextAsync().WithCancellation(_cancelTokenSource.Token),
- _cancelTokenSource.Token);
-
- if (_cancelTokenSource.Token.IsCancellationRequested)
- {
- IsListening = false;
- return;
- }
-
- await ProcessMessage(context);
- }
- catch (ObjectDisposedException)
- {
- IsListening = false;
- LogManager.Log("Server shutting down->Server Disposed",
- nameof(WebServer));
- }
- catch (TaskCanceledException)
- {
- IsListening = false;
- LogManager.Log("Server shutting down->Task Cancelled",
- nameof(WebServer));
- }
- catch (Exception ex)
- {
- LogManager
- .LogException("Server threw an exception while listening",
- nameof(WebServer), ex: ex);
- }
- } while (IsListening);
- }
- ///
- /// Shuts down the server
- ///
- public void Shutdown()
- {
- _cancelTokenSource?.Cancel();
- Dispose();
- }
- ///
- /// Update method that dispatches any received messages via events
- ///
- /// The amount of time since the last update call
- public virtual void Update(float dt)
- {
- bool requestsReady;
- lock (_requestLock)
- {
- requestsReady = _requestMessages.Any();
- }
-
- if (!requestsReady)
- {
- return;
- }
-
- WebServerMessage requestToHandle;
- lock (_requestLock)
- {
- requestToHandle = _requestMessages.Dequeue();
- }
-
- if (requestToHandle.IsValid)
- {
- WebMethod method =
- EnumUtility.GetValueFromDescription(requestToHandle
- .HttpMethod);
-
- switch (method)
- {
- case WebMethod.POST:
- POSTMessageReceived?.Invoke(this, requestToHandle);
- break;
- case WebMethod.GET:
- GETMessageReceived?.Invoke(this, requestToHandle);
- break;
- case WebMethod.PATCH:
- PATCHMessageReceived?.Invoke(this, requestToHandle);
- break;
- case WebMethod.DELETE:
- DELETEMessageReceived?.Invoke(this, requestToHandle);
- break;
- case WebMethod.PUT:
- PUTMessageReceived?.Invoke(this, requestToHandle);
- break;
- default:
- LogManager
- .LogWarning($"Received unimplemented Http Method {method}",
- nameof(WebServer));
-
- break;
- }
- }
- else
- {
- LogManager.LogWarning("Received an invalid request from the web",
- nameof(WebServer));
- }
- }
- ///
- /// Helper function used to process the incoming web message
- ///
- /// Reference to the current http context to retrieve a web request from
- private async Task ProcessMessage(HttpListenerContext context)
- {
- try
- {
- HttpListenerRequest request = context.Request;
- HttpListenerResponse response = context.Response;
- if (request.IsWebSocketRequest)
- {
- HttpListenerWebSocketContext ctx =
- await context.AcceptWebSocketAsync(null);
-
- WebSocket webSocket = ctx.WebSocket;
- WebSocketClientConnected?.Invoke(this,
- new
- WebSocketConnectMessage(webSocket,
- request,
- response));
-
- return;
- }
-
- lock (_requestLock)
- {
- _requestMessages.Enqueue(new WebServerMessage(context, request,
- response));
- }
- }
- catch (ObjectDisposedException)
- {
- LogManager.Log("Received message when server has been disposed",
- nameof(WebServer));
- }
- catch (HttpListenerException)
- {
- LogManager.Log("Unknown listener exception", nameof(WebServer));
- }
- catch (Exception ex)
- {
- LogManager.LogException("Unhandled exception has been caught",
- nameof(WebServer), ex: ex);
- }
- }
-}
\ No newline at end of file
diff --git a/Networking/Web/WebSocketConnectMessage.cs b/Networking/Web/WebSocketConnectMessage.cs
deleted file mode 100644
index b2cb936..0000000
--- a/Networking/Web/WebSocketConnectMessage.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-using System.Net;
-using System.Net.WebSockets;
-
-namespace FluffyVoid.Networking.Web;
-
-///
-/// Message class used to hold HTTP items useful for handling HTTP message traffic via a WebSocket connection
-///
-public readonly struct WebSocketConnectMessage
-{
- ///
- /// Reference to the WebSocket connection
- ///
- public WebSocket Socket { get; }
- ///
- /// Reference to the HTTP request
- ///
- public HttpListenerRequest Request { get; }
- ///
- /// Reference to the HTTP Response
- ///
- public HttpListenerResponse Response { get; }
- ///
- /// Whether the message is valid or not
- ///
- public bool IsValid =>
- Socket != null && Request != null && Response != null;
-
- ///
- /// Constructor used to build the web socket connect message
- ///
- /// Reference to the WebSocket connection
- /// Reference to the HTTP request
- /// Reference to the HTTP Response
- public WebSocketConnectMessage(WebSocket socket,
- HttpListenerRequest request,
- HttpListenerResponse response)
- {
- Socket = socket;
- Request = request;
- Response = response;
- }
-}
\ No newline at end of file
diff --git a/Networking/Web/WebUtilities.cs b/Networking/Web/WebUtilities.cs
deleted file mode 100644
index bae4d80..0000000
--- a/Networking/Web/WebUtilities.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-namespace FluffyVoid.Networking.Web;
-
-///
-/// Organizational class for utilities that relate to HTTP web tasks
-///
-public static class WebUtilities
-{
- ///
- /// Extension method used to deep clone an existing HTTPRequestMessage
- ///
- /// Reference to the existing request
- /// A deep copy of the passed in request
- public static HttpRequestMessage Clone(this HttpRequestMessage request)
- {
- HttpRequestMessage result =
- new HttpRequestMessage(request.Method, request.RequestUri)
- {
- Content = request.Content,
- Version = request.Version
- };
-
- foreach (KeyValuePair property in request.Properties)
- {
- result.Properties.Add(property);
- }
-
- foreach (KeyValuePair> header in request
- .Headers)
- {
- result.Headers.TryAddWithoutValidation(header.Key, header.Value);
- }
-
- return result;
- }
-}
\ No newline at end of file
diff --git a/Networking/WebSocket/WebSocketClient.cs b/Networking/WebSocket/WebSocketClient.cs
deleted file mode 100644
index 2851358..0000000
--- a/Networking/WebSocket/WebSocketClient.cs
+++ /dev/null
@@ -1,253 +0,0 @@
-using System.Net;
-using System.Net.WebSockets;
-using System.Text;
-using FluffyVoid.Logging;
-
-namespace FluffyVoid.Networking.WebSockets;
-
-///
-/// Client class used to communicate via WebSocket
-///
-public class WebSocketClient
-{
- ///
- /// Message buffer to use when receiving messages
- ///
- private readonly byte[] _buffer = new byte[8192];
- ///
- /// Optional header key to add to all messages
- ///
- private readonly KeyValuePair _header;
- ///
- /// Reconnect falloff table to ensure we don't spam a reconnection
- ///
- private readonly int[] _reconnectFalloff =
- [
- 1000,
- 2000,
- 4000,
- 8000,
- 16000,
- 32000,
- 64000,
- 128000
- ];
- ///
- /// Cancellation token used to cancel any active tasks for the client
- ///
- private CancellationTokenSource? _cancellationTokenSource;
-
- ///
- /// The web socket client to use for sending and receiving messages
- ///
- private ClientWebSocket? _client;
- ///
- /// Current reconnect attempt
- ///
- private int _reconnectCounter;
- ///
- /// The currently connected URI for the connection
- ///
- private string? _uri;
-
- ///
- /// Whether to allow the client to auto-reconnect or to allow the user to handle disconnections
- ///
- public bool AutoReconnect { protected get; set; } = false;
- ///
- /// The KeepAlive interval for the connection
- ///
- public TimeSpan KeepAliveInterval { protected get; set; } = TimeSpan.Zero;
- ///
- /// Optional Proxy object to use when making the connection
- ///
- public IWebProxy? Proxy { protected get; set; } = null;
- ///
- /// Optional SubProtocol for the connection to utilize
- ///
- public string? SubProtocol { protected get; set; } = null;
- ///
- /// Event used to notify listeners that the client has connected
- ///
- public event EventHandler? Connected;
- ///
- /// Event used to notify listeners that the client has been disconnected
- ///
- public event EventHandler? Disconnected;
- ///
- /// Event used to notify listeners that a message has been received
- ///
- public event EventHandler? MessageReceived;
-
- ///
- /// Default constructor used to initialize the client
- ///
- public WebSocketClient()
- {
- }
- ///
- /// Default constructor used to initialize the client
- ///
- /// The header to assign to all messages
- public WebSocketClient(KeyValuePair header)
- {
- _header = header;
- }
-
- ///
- /// Connects the client to the specified URI
- ///
- /// The websocket address to connect to
- public async Task ConnectAsync(string uri)
- {
- _client = new ClientWebSocket();
- _uri = uri;
- _client.Options.KeepAliveInterval = KeepAliveInterval;
- if (!string.IsNullOrEmpty(_header.Key) &&
- !string.IsNullOrEmpty(_header.Value))
- {
- _client.Options.SetRequestHeader(_header.Key, _header.Value);
- }
-
- if (!string.IsNullOrEmpty(SubProtocol))
- {
- _client.Options.AddSubProtocol(SubProtocol);
- }
-
- if (Proxy != null)
- {
- _client.Options.Proxy = Proxy;
- }
-
- if (_cancellationTokenSource != null)
- {
- _cancellationTokenSource.Dispose();
- }
-
- _cancellationTokenSource = new CancellationTokenSource();
- await _client.ConnectAsync(new Uri(uri),
- _cancellationTokenSource.Token);
-
- if (_client.State == WebSocketState.Open)
- {
- Connected?.Invoke(this, EventArgs.Empty);
- _reconnectCounter = 0;
- }
- }
- ///
- /// Listens for incoming messages from the connected source
- ///
- public async Task ListenAsync()
- {
- if (_client == null || _cancellationTokenSource == null || _uri == null)
- {
- LogManager
- .LogError("Websocket client has not been created, unable to listen for messages. Call ConnectAsync prior to attempting to ListenAsync.",
- nameof(WebSocketClient));
-
- return;
- }
-
- StringBuilder message = new StringBuilder();
- while (!_cancellationTokenSource.IsCancellationRequested)
- {
- try
- {
- //rx messages
- WebSocketReceiveResult result;
- message.Clear();
- do
- {
- result =
- await
- _client
- .ReceiveAsync(new ArraySegment(_buffer),
- _cancellationTokenSource.Token);
-
- message.Append(Encoding.UTF8.GetString(_buffer, 0,
- result.Count));
- } while (!result.EndOfMessage);
-
- MessageReceived?.Invoke(this, message.ToString());
- if (_client.State != WebSocketState.Closed)
- {
- continue;
- }
-
- if (!AutoReconnect)
- {
- break;
- }
-
- if (_reconnectCounter >= _reconnectFalloff.Length)
- {
- Disconnected?.Invoke(this,
- $"Websocket connection closed, auto-reconnect failed after {_reconnectFalloff.Length} attempts.");
-
- return;
- }
-
- Disconnected?.Invoke(this,
- $"Websocket connection closed, attempting auto-reconnect with server in {_reconnectFalloff[_reconnectCounter] / 1000} second(s)");
-
- await Task.Delay(_reconnectFalloff[_reconnectCounter++]);
- await ConnectAsync(_uri);
- }
- catch (OperationCanceledException)
- {
- Disconnected?.Invoke(this,
- "Websocket connection shutdown by the client.");
-
- return;
- }
- catch (Exception ex)
- {
- Disconnected?.Invoke(this,
- $"Websocket connection threw an exception, shutting down the connection./n{ex.Message}");
-
- return;
- }
- }
-
- Disconnected?.Invoke(this, "Websocket connection closed.");
- }
- ///
- /// Sends a message via the WebSocket connection
- ///
- /// The message to send
- public async Task SendMessageAsync(string message)
- {
- if (_client == null || _cancellationTokenSource == null)
- {
- LogManager
- .LogError($"Websocket client has not been created, unable to send {message}",
- nameof(WebSocketClient));
-
- return;
- }
-
- if (_client.State != WebSocketState.Open)
- {
- LogManager
- .LogError($"No active Websocket connection, unable to send {message}",
- nameof(WebSocketClient));
-
- return;
- }
-
- try
- {
- await
- _client
- .SendAsync(new ArraySegment(Encoding.UTF8.GetBytes(message)),
- WebSocketMessageType.Text, true,
- _cancellationTokenSource.Token);
- }
- catch (Exception ex)
- {
- LogManager
- .LogException($"Sending {message} via Websocket connection failed",
- nameof(WebSocketClient), ex: ex);
- }
- }
-}
\ No newline at end of file