[
  {
    "path": ".config/dotnet-tools.json",
    "content": "{\n  \"version\": 1,\n  \"isRoot\": true,\n  \"tools\": {\n    \"androidsdk.tool\": {\n      \"version\": \"0.25.0\",\n      \"commands\": [\n        \"android\"\n      ],\n      \"rollForward\": true\n    },\n    \"microsoft.dotnet.xharness.cli\": {\n      \"version\": \"11.0.0-prerelease.26114.1\",\n      \"commands\": [\n        \"xharness\"\n      ],\n      \"rollForward\": true\n    }\n  }\n}\n"
  },
  {
    "path": ".editorconfig",
    "content": "root = true\n\n# All files\n[*]\nindent_style = tab\n\n# Xml files\n[*.xml]\nindent_style = space\nindent_size = 2\n\n# C# files\n[*.cs]\n\n#### Core EditorConfig Options ####\n\n# Indentation and spacing\nindent_size = 4\ntab_width = 4\n\n# New line preferences\nend_of_line = crlf\ninsert_final_newline = false\n\n#### .NET Coding Conventions ####\n[*.{cs,vb}]\n\n# Organize usings\ndotnet_separate_import_directive_groups = true\ndotnet_sort_system_directives_first = true\nfile_header_template = unset\n\n# this. and Me. preferences\ndotnet_style_qualification_for_event = false:silent\ndotnet_style_qualification_for_field = false:silent\ndotnet_style_qualification_for_method = false:silent\ndotnet_style_qualification_for_property = false:silent\n\n# Language keywords vs BCL types preferences\ndotnet_style_predefined_type_for_locals_parameters_members = true:silent\ndotnet_style_predefined_type_for_member_access = true:silent\n\n# Parentheses preferences\ndotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent\ndotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent\ndotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent\ndotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent\n\n# Modifier preferences\ndotnet_style_require_accessibility_modifiers = for_non_interface_members:silent\n\n# Expression-level preferences\ndotnet_style_coalesce_expression = true:suggestion\ndotnet_style_collection_initializer = true:suggestion\ndotnet_style_explicit_tuple_names = true:suggestion\ndotnet_style_null_propagation = true:suggestion\ndotnet_style_object_initializer = true:suggestion\ndotnet_style_operator_placement_when_wrapping = beginning_of_line\ndotnet_style_prefer_auto_properties = true:suggestion\ndotnet_style_prefer_compound_assignment = true:suggestion\ndotnet_style_prefer_conditional_expression_over_assignment = true:suggestion\ndotnet_style_prefer_conditional_expression_over_return = true:suggestion\ndotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion\ndotnet_style_prefer_inferred_tuple_names = true:suggestion\ndotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion\ndotnet_style_prefer_simplified_boolean_expressions = true:suggestion\ndotnet_style_prefer_simplified_interpolation = true:suggestion\n\n# Parameter preferences\ndotnet_code_quality_unused_parameters = all:suggestion\n\n# Suppression preferences\ndotnet_remove_unnecessary_suppression_exclusions = none\n\n#### C# Coding Conventions ####\n[*.cs]\n\n# var preferences\ncsharp_style_var_elsewhere = false:silent\ncsharp_style_var_for_built_in_types = false:silent\ncsharp_style_var_when_type_is_apparent = false:silent\n\n# Expression-bodied members\ncsharp_style_expression_bodied_accessors = true:silent\ncsharp_style_expression_bodied_constructors = false:silent\ncsharp_style_expression_bodied_indexers = true:silent\ncsharp_style_expression_bodied_lambdas = true:suggestion\ncsharp_style_expression_bodied_local_functions = false:silent\ncsharp_style_expression_bodied_methods = false:silent\ncsharp_style_expression_bodied_operators = false:silent\ncsharp_style_expression_bodied_properties = true:silent\n\n# Pattern matching preferences\ncsharp_style_pattern_matching_over_as_with_null_check = true:suggestion\ncsharp_style_pattern_matching_over_is_with_cast_check = true:suggestion\ncsharp_style_prefer_not_pattern = true:suggestion\ncsharp_style_prefer_pattern_matching = true:silent\ncsharp_style_prefer_switch_expression = true:suggestion\n\n# Null-checking preferences\ncsharp_style_conditional_delegate_call = true:suggestion\n\n# Modifier preferences\ncsharp_prefer_static_local_function = true:warning\ncsharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:silent\n\n# Code-block preferences\ncsharp_prefer_braces = true:silent\ncsharp_prefer_simple_using_statement = true:suggestion\n\n# Expression-level preferences\ncsharp_prefer_simple_default_expression = true:suggestion\ncsharp_style_deconstructed_variable_declaration = true:suggestion\ncsharp_style_inlined_variable_declaration = true:suggestion\ncsharp_style_pattern_local_over_anonymous_function = true:suggestion\ncsharp_style_prefer_index_operator = true:suggestion\ncsharp_style_prefer_range_operator = true:suggestion\ncsharp_style_throw_expression = true:suggestion\ncsharp_style_unused_value_assignment_preference = discard_variable:suggestion\ncsharp_style_unused_value_expression_statement_preference = discard_variable:silent\n\n# 'using' directive preferences\ncsharp_using_directive_placement = outside_namespace:silent\n\n#### C# Formatting Rules ####\n\n# New line preferences\ncsharp_new_line_before_catch = true\ncsharp_new_line_before_else = true\ncsharp_new_line_before_finally = true\ncsharp_new_line_before_members_in_anonymous_types = true\ncsharp_new_line_before_members_in_object_initializers = true\ncsharp_new_line_before_open_brace = all\ncsharp_new_line_between_query_expression_clauses = true\n\n# Indentation preferences\ncsharp_indent_block_contents = true\ncsharp_indent_braces = false\ncsharp_indent_case_contents = true\ncsharp_indent_case_contents_when_block = true\ncsharp_indent_labels = one_less_than_current\ncsharp_indent_switch_labels = true\n\n# Space preferences\ncsharp_space_after_cast = false\ncsharp_space_after_colon_in_inheritance_clause = true\ncsharp_space_after_comma = true\ncsharp_space_after_dot = false\ncsharp_space_after_keywords_in_control_flow_statements = true\ncsharp_space_after_semicolon_in_for_statement = true\ncsharp_space_around_binary_operators = before_and_after\ncsharp_space_around_declaration_statements = false\ncsharp_space_before_colon_in_inheritance_clause = true\ncsharp_space_before_comma = false\ncsharp_space_before_dot = false\ncsharp_space_before_open_square_brackets = false\ncsharp_space_before_semicolon_in_for_statement = false\ncsharp_space_between_empty_square_brackets = false\ncsharp_space_between_method_call_empty_parameter_list_parentheses = false\ncsharp_space_between_method_call_name_and_opening_parenthesis = false\ncsharp_space_between_method_call_parameter_list_parentheses = false\ncsharp_space_between_method_declaration_empty_parameter_list_parentheses = false\ncsharp_space_between_method_declaration_name_and_open_parenthesis = false\ncsharp_space_between_method_declaration_parameter_list_parentheses = false\ncsharp_space_between_parentheses = false\ncsharp_space_between_square_brackets = false\n\n# Wrapping preferences\ncsharp_preserve_single_line_blocks = true\ncsharp_preserve_single_line_statements = true\n\n#### Naming styles ####\n[*.{cs,vb}]\n\n# Naming rules\n\ndotnet_naming_rule.types_and_namespaces_should_be_pascalcase.severity = suggestion\ndotnet_naming_rule.types_and_namespaces_should_be_pascalcase.symbols = types_and_namespaces\ndotnet_naming_rule.types_and_namespaces_should_be_pascalcase.style = pascalcase\n\ndotnet_naming_rule.interfaces_should_be_ipascalcase.severity = suggestion\ndotnet_naming_rule.interfaces_should_be_ipascalcase.symbols = interfaces\ndotnet_naming_rule.interfaces_should_be_ipascalcase.style = ipascalcase\n\ndotnet_naming_rule.type_parameters_should_be_tpascalcase.severity = suggestion\ndotnet_naming_rule.type_parameters_should_be_tpascalcase.symbols = type_parameters\ndotnet_naming_rule.type_parameters_should_be_tpascalcase.style = tpascalcase\n\ndotnet_naming_rule.methods_should_be_pascalcase.severity = suggestion\ndotnet_naming_rule.methods_should_be_pascalcase.symbols = methods\ndotnet_naming_rule.methods_should_be_pascalcase.style = pascalcase\n\ndotnet_naming_rule.properties_should_be_pascalcase.severity = suggestion\ndotnet_naming_rule.properties_should_be_pascalcase.symbols = properties\ndotnet_naming_rule.properties_should_be_pascalcase.style = pascalcase\n\ndotnet_naming_rule.events_should_be_pascalcase.severity = suggestion\ndotnet_naming_rule.events_should_be_pascalcase.symbols = events\ndotnet_naming_rule.events_should_be_pascalcase.style = pascalcase\n\ndotnet_naming_rule.local_variables_should_be_camelcase.severity = suggestion\ndotnet_naming_rule.local_variables_should_be_camelcase.symbols = local_variables\ndotnet_naming_rule.local_variables_should_be_camelcase.style = camelcase\n\ndotnet_naming_rule.local_constants_should_be_camelcase.severity = suggestion\ndotnet_naming_rule.local_constants_should_be_camelcase.symbols = local_constants\ndotnet_naming_rule.local_constants_should_be_camelcase.style = camelcase\n\ndotnet_naming_rule.parameters_should_be_camelcase.severity = suggestion\ndotnet_naming_rule.parameters_should_be_camelcase.symbols = parameters\ndotnet_naming_rule.parameters_should_be_camelcase.style = camelcase\n\ndotnet_naming_rule.public_fields_should_be_pascalcase.severity = suggestion\ndotnet_naming_rule.public_fields_should_be_pascalcase.symbols = public_fields\ndotnet_naming_rule.public_fields_should_be_pascalcase.style = pascalcase\n\ndotnet_naming_rule.private_fields_should_be__camelcase.severity = suggestion\ndotnet_naming_rule.private_fields_should_be__camelcase.symbols = private_fields\ndotnet_naming_rule.private_fields_should_be__camelcase.style = _camelcase\n\ndotnet_naming_rule.private_static_fields_should_be_s_camelcase.severity = suggestion\ndotnet_naming_rule.private_static_fields_should_be_s_camelcase.symbols = private_static_fields\ndotnet_naming_rule.private_static_fields_should_be_s_camelcase.style = s_camelcase\n\ndotnet_naming_rule.public_constant_fields_should_be_pascalcase.severity = suggestion\ndotnet_naming_rule.public_constant_fields_should_be_pascalcase.symbols = public_constant_fields\ndotnet_naming_rule.public_constant_fields_should_be_pascalcase.style = pascalcase\n\ndotnet_naming_rule.private_constant_fields_should_be_pascalcase.severity = suggestion\ndotnet_naming_rule.private_constant_fields_should_be_pascalcase.symbols = private_constant_fields\ndotnet_naming_rule.private_constant_fields_should_be_pascalcase.style = pascalcase\n\ndotnet_naming_rule.public_static_readonly_fields_should_be_pascalcase.severity = suggestion\ndotnet_naming_rule.public_static_readonly_fields_should_be_pascalcase.symbols = public_static_readonly_fields\ndotnet_naming_rule.public_static_readonly_fields_should_be_pascalcase.style = pascalcase\n\ndotnet_naming_rule.private_static_readonly_fields_should_be_pascalcase.severity = suggestion\ndotnet_naming_rule.private_static_readonly_fields_should_be_pascalcase.symbols = private_static_readonly_fields\ndotnet_naming_rule.private_static_readonly_fields_should_be_pascalcase.style = pascalcase\n\ndotnet_naming_rule.enums_should_be_pascalcase.severity = suggestion\ndotnet_naming_rule.enums_should_be_pascalcase.symbols = enums\ndotnet_naming_rule.enums_should_be_pascalcase.style = pascalcase\n\ndotnet_naming_rule.local_functions_should_be_pascalcase.severity = suggestion\ndotnet_naming_rule.local_functions_should_be_pascalcase.symbols = local_functions\ndotnet_naming_rule.local_functions_should_be_pascalcase.style = pascalcase\n\ndotnet_naming_rule.non_field_members_should_be_pascalcase.severity = suggestion\ndotnet_naming_rule.non_field_members_should_be_pascalcase.symbols = non_field_members\ndotnet_naming_rule.non_field_members_should_be_pascalcase.style = pascalcase\n\n# Symbol specifications\n\ndotnet_naming_symbols.interfaces.applicable_kinds = interface\ndotnet_naming_symbols.interfaces.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected\ndotnet_naming_symbols.interfaces.required_modifiers = \n\ndotnet_naming_symbols.enums.applicable_kinds = enum\ndotnet_naming_symbols.enums.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected\ndotnet_naming_symbols.enums.required_modifiers = \n\ndotnet_naming_symbols.events.applicable_kinds = event\ndotnet_naming_symbols.events.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected\ndotnet_naming_symbols.events.required_modifiers = \n\ndotnet_naming_symbols.methods.applicable_kinds = method\ndotnet_naming_symbols.methods.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected\ndotnet_naming_symbols.methods.required_modifiers = \n\ndotnet_naming_symbols.properties.applicable_kinds = property\ndotnet_naming_symbols.properties.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected\ndotnet_naming_symbols.properties.required_modifiers = \n\ndotnet_naming_symbols.public_fields.applicable_kinds = field\ndotnet_naming_symbols.public_fields.applicable_accessibilities = public, internal\ndotnet_naming_symbols.public_fields.required_modifiers = \n\ndotnet_naming_symbols.private_fields.applicable_kinds = field\ndotnet_naming_symbols.private_fields.applicable_accessibilities = private, protected, protected_internal, private_protected\ndotnet_naming_symbols.private_fields.required_modifiers = \n\ndotnet_naming_symbols.private_static_fields.applicable_kinds = field\ndotnet_naming_symbols.private_static_fields.applicable_accessibilities = private, protected, protected_internal, private_protected\ndotnet_naming_symbols.private_static_fields.required_modifiers = static\n\ndotnet_naming_symbols.types_and_namespaces.applicable_kinds = namespace, class, struct, interface, enum\ndotnet_naming_symbols.types_and_namespaces.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected\ndotnet_naming_symbols.types_and_namespaces.required_modifiers = \n\ndotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method\ndotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected\ndotnet_naming_symbols.non_field_members.required_modifiers = \n\ndotnet_naming_symbols.type_parameters.applicable_kinds = namespace\ndotnet_naming_symbols.type_parameters.applicable_accessibilities = *\ndotnet_naming_symbols.type_parameters.required_modifiers = \n\ndotnet_naming_symbols.private_constant_fields.applicable_kinds = field\ndotnet_naming_symbols.private_constant_fields.applicable_accessibilities = private, protected, protected_internal, private_protected\ndotnet_naming_symbols.private_constant_fields.required_modifiers = const\n\ndotnet_naming_symbols.local_variables.applicable_kinds = local\ndotnet_naming_symbols.local_variables.applicable_accessibilities = local\ndotnet_naming_symbols.local_variables.required_modifiers = \n\ndotnet_naming_symbols.local_constants.applicable_kinds = local\ndotnet_naming_symbols.local_constants.applicable_accessibilities = local\ndotnet_naming_symbols.local_constants.required_modifiers = const\n\ndotnet_naming_symbols.parameters.applicable_kinds = parameter\ndotnet_naming_symbols.parameters.applicable_accessibilities = *\ndotnet_naming_symbols.parameters.required_modifiers = \n\ndotnet_naming_symbols.public_constant_fields.applicable_kinds = field\ndotnet_naming_symbols.public_constant_fields.applicable_accessibilities = public, internal\ndotnet_naming_symbols.public_constant_fields.required_modifiers = const\n\ndotnet_naming_symbols.public_static_readonly_fields.applicable_kinds = field\ndotnet_naming_symbols.public_static_readonly_fields.applicable_accessibilities = public, internal\ndotnet_naming_symbols.public_static_readonly_fields.required_modifiers = readonly, static\n\ndotnet_naming_symbols.private_static_readonly_fields.applicable_kinds = field\ndotnet_naming_symbols.private_static_readonly_fields.applicable_accessibilities = private, protected, protected_internal, private_protected\ndotnet_naming_symbols.private_static_readonly_fields.required_modifiers = readonly, static\n\ndotnet_naming_symbols.local_functions.applicable_kinds = local_function\ndotnet_naming_symbols.local_functions.applicable_accessibilities = *\ndotnet_naming_symbols.local_functions.required_modifiers = \n\n# Naming styles\n\ndotnet_naming_style.pascalcase.required_prefix = \ndotnet_naming_style.pascalcase.required_suffix = \ndotnet_naming_style.pascalcase.word_separator = \ndotnet_naming_style.pascalcase.capitalization = pascal_case\n\ndotnet_naming_style.ipascalcase.required_prefix = I\ndotnet_naming_style.ipascalcase.required_suffix = \ndotnet_naming_style.ipascalcase.word_separator = \ndotnet_naming_style.ipascalcase.capitalization = pascal_case\n\ndotnet_naming_style.tpascalcase.required_prefix = T\ndotnet_naming_style.tpascalcase.required_suffix = \ndotnet_naming_style.tpascalcase.word_separator = \ndotnet_naming_style.tpascalcase.capitalization = pascal_case\n\ndotnet_naming_style._camelcase.required_prefix = _\ndotnet_naming_style._camelcase.required_suffix = \ndotnet_naming_style._camelcase.word_separator = \ndotnet_naming_style._camelcase.capitalization = camel_case\n\ndotnet_naming_style.camelcase.required_prefix = \ndotnet_naming_style.camelcase.required_suffix = \ndotnet_naming_style.camelcase.word_separator = \ndotnet_naming_style.camelcase.capitalization = camel_case\n\ndotnet_naming_style.s_camelcase.required_prefix = s_\ndotnet_naming_style.s_camelcase.required_suffix = \ndotnet_naming_style.s_camelcase.word_separator = \ndotnet_naming_style.s_camelcase.capitalization = camel_case\n\n# CommunityToolkit.Mvvm\ndotnet_analyzer_diagnostic.category-CommunityToolkit.Mvvm.SourceGenerators.ObservablePropertyGenerator.severity = none\n"
  },
  {
    "path": ".gitattributes",
    "content": "# Auto detect text files and perform LF normalization\n* text=auto\n"
  },
  {
    "path": ".github/copilot-instructions.md",
    "content": "# Spice 🌶 — Copilot Instructions\n\nMinimal cross-platform mobile UI framework for .NET (iOS + Android). **No** `Microsoft.Maui.Controls`, XAML, DI, MVVM, data-binding, or `System.Reflection`. Views are POCOs mapping to native controls. Uses only `Microsoft.Maui.Graphics` (`Color`) and MAUI's SingleProject + Resizetizer.\n\n## Partial Class Pattern (Core Architecture)\n\nEach view = 3 files: `Core/{Type}.cs` (cross-platform, `[ObservableProperty]`), `Platforms/iOS/{Type}.cs` (UIKit), `Platforms/Android/{Type}.cs` (Android widgets). Platform partials implement `partial void On{Prop}Changed`. Platform files excluded from other TFMs via `Spice.targets`. Follow `Image`/`Label` as templates for new controls.\n\n## Conventions\n\n- **Namespace**: `Spice` only — no sub-namespaces\n- **Properties**: `[ObservableProperty]` on `_camelCase` fields → generates `PascalCase` + `On{Prop}Changed`\n- **Implicit operators**: `public static implicit operator NativeType(SpiceType)` in platform partials\n- **Lazy views**: `Lazy<T> _nativeView` with factory function\n- **XML docs**: Required on all public API; include platform mappings (e.g. `Android.Widget.TextView / UIKit.UILabel`)\n- **GlobalUsings**: `CommunityToolkit.Mvvm.ComponentModel` + `Color = Microsoft.Maui.Graphics.Color`\n- **`VANILLA` define**: Active on `net10.0` only; prefer partials over `#if`\n- **Blazor**: `Blazor/` folders at library+platform levels; `BlazorWebView` extends `WebView`\n- **iOS memory**: NSObject subclasses must not hold strong references to other NSObjects (causes cycles the garbage collector cannot break). Use `WeakReference<T>` for any NSObject-typed field/property in an NSObject subclass. Enforced by [`MemoryAnalyzers`](https://github.com/jonathanpeppers/memory-analyzers) (MEM0001–MEM0003).\n\n## Layout\n\n```\nsrc/Spice/Core/          cross-platform views\nsrc/Spice/Platforms/     iOS + Android partials, entry points\nsrc/Spice/Blazor/        cross-platform Blazor; platform Blazor in Platforms/*/Blazor/\nsrc/Spice/MSBuild/       Spice.props (capabilities), Spice.targets (inlined SingleProject)\nsamples/                 Spice.Scenarios, Spice.BlazorSample, HeadToHead*\ntests/Spice.Tests/       xUnit on net10.0 — views tested as POCOs, no device needed\nsizes/                   .apkdesc baselines for CI apkdiff (10% APK / 15% content thresholds)\nsrc/Spice.Templates/     dotnet new spice / spice-blazor\n```\n\n## Build & Test\n\n```sh\ndotnet build                                      # all TFMs (needs maui-android + maui-ios workloads)\ndotnet build -f net10.0-android -t:Run             # run Android\ndotnet build -f net10.0-ios -t:Run                 # run iOS\ndotnet test tests/Spice.Tests/Spice.Tests.csproj   # unit tests (net10.0, no device)\n```\n\n## Entry Points\n\n- **iOS**: Scene-based. `SpiceAppDelegate<TApp>` + `SpiceSceneDelegate<TApp>`. Consumers: `class AppDelegate : SpiceAppDelegate<App> { }`. Requires `UIApplicationSceneManifest` in Info.plist. Window via `Platform.Window`.\n- **Android**: `SpiceActivity : AppCompatActivity`. Sets `Platform.Context`. Consumers call `SetContentView(new App())`.\n\n## MSBuild\n\n`Spice.targets` inlines MAUI's SingleProject logic (platform folder filtering, IDE capabilities) because Spice doesn't reference MAUI Controls. Do not add a `Microsoft.Maui.Controls` dependency.\n\n## CI\n\n`macos-latest`: build → apkdiff size check → test → pack. Update baselines: `apkdiff -s --save-description-2=sizes/{name}.apkdesc`.\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "# Please see the documentation for all configuration options:\n# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates\n\nversion: 2\nupdates:\n  - package-ecosystem: \"nuget\"\n    directory: \"/\" # Location of package manifests\n    schedule:\n      interval: \"daily\"\n"
  },
  {
    "path": ".github/workflows/copilot-setup-steps.yml",
    "content": "name: \"Copilot Setup Steps\"\n\non:\n  workflow_dispatch:\n  push:\n    paths:\n      - .github/workflows/copilot-setup-steps.yml\n  pull_request:\n    paths:\n      - .github/workflows/copilot-setup-steps.yml\n\njobs:\n  copilot-setup-steps:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n    env:\n      WORKLOAD_VERSION: 10.0.103\n    steps:\n      - name: checkout\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n\n      - name: install .NET\n        uses: actions/setup-dotnet@v4\n        with:\n          dotnet-version: 10.0.x\n\n      - name: install workloads\n        run: dotnet workload install maui-android --version $WORKLOAD_VERSION\n"
  },
  {
    "path": ".github/workflows/spice.yml",
    "content": "name: build\n\non:\n  push:\n    branches: [ \"main\" ]\n  pull_request:\n    branches: [ \"main\" ]\n\njobs:\n\n  build:\n\n    runs-on: macos-latest\n\n    env:\n      WORKLOAD_VERSION: 10.0.103\n      ValidateXcodeVersion: false\n      APK_PERCENTAGE_REGRESSION: 10\n      CONTENT_PERCENTAGE_REGRESSION: 15\n\n    steps:\n    - name: checkout\n      uses: actions/checkout@v4\n      with:\n        fetch-depth: 0\n\n    - name: select Xcode version\n      uses: maxim-lobanov/setup-xcode@v1\n      with:\n        xcode-version: latest-stable\n\n    - name: install .NET\n      uses: actions/setup-dotnet@v4\n      with:\n        dotnet-version: 10.0.x\n\n    - name: cache NuGet packages\n      uses: actions/cache@v4\n      with:\n        path: ~/.nuget/packages\n        key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/*.slnx', '**/Directory.Build.props', '**/Directory.Build.targets') }}\n        restore-keys: |\n          ${{ runner.os }}-nuget-\n        \n    - name: install workloads\n      run: dotnet workload install maui-android maui-ios --version $WORKLOAD_VERSION\n\n    - name: restore all projects\n      run: |\n        dotnet restore spice.slnx\n        dotnet restore samples/samples.slnx\n\n    - name: build main solution (Release)\n      run: dotnet build spice.slnx -c Release --no-restore -bl:bin/build-main.binlog -maxcpucount\n\n    - name: build samples (Debug, faster)\n      run: dotnet build samples/samples.slnx -c Debug --no-restore -bl:bin/build-samples.binlog -maxcpucount\n\n    - name: tests\n      run: dotnet test tests/Spice.Tests/Spice.Tests.csproj -f net10.0 -c Release --no-build\n\n    - name: pack\n      run: dotnet pack spice.slnx -c Release --no-build -bl:bin/pack.binlog\n\n    - name: build templates\n      run: |\n        dotnet new install src/Spice.Templates\n        mkdir -p bin/templates && cd bin/templates\n        dotnet new spice -n Hello\n        dotnet new spice-blazor -n HelloBlazor\n        TARGETS='<Project><PropertyGroup><RestorePackagesPath>$(MSBuildThisFileDirectory)packages</RestorePackagesPath><RestoreAdditionalProjectSources>$(MSBuildThisFileDirectory)../../../bin/Release/</RestoreAdditionalProjectSources><RestoreNoCache>true</RestoreNoCache></PropertyGroup></Project>'\n        echo $TARGETS > Hello/Directory.Build.targets\n        echo $TARGETS > HelloBlazor/Directory.Build.targets\n        echo '<Project />' > Directory.Build.props\n        echo '<Project />' > Directory.Build.targets\n        dotnet build Hello/Hello.csproj -f net10.0-android -c Release -r android-arm64\n        dotnet build HelloBlazor/HelloBlazor.csproj -f net10.0-android -c Release -r android-arm64\n\n    - name: run apkdiff\n      run: |\n        dotnet tool install --global apkdiff\n        apkdiff -s --save-description-2=bin/com.companyname.Hello-Signed.apkdesc --descrease-is-regression --test-apk-percentage-regression=$APK_PERCENTAGE_REGRESSION --test-content-percentage-regression=$CONTENT_PERCENTAGE_REGRESSION sizes/com.companyname.Hello-Signed.apkdesc bin/templates/Hello/bin/Release/net10.0-android/android-arm64/com.companyname.Hello-Signed.apk\n        apkdiff -s --save-description-2=bin/com.companyname.HelloBlazor-Signed.apkdesc --descrease-is-regression --test-apk-percentage-regression=$APK_PERCENTAGE_REGRESSION --test-content-percentage-regression=$CONTENT_PERCENTAGE_REGRESSION sizes/com.companyname.HelloBlazor-Signed.apkdesc bin/templates/HelloBlazor/bin/Release/net10.0-android/android-arm64/com.companyname.HelloBlazor-Signed.apk\n\n    - name: artifacts\n      if: always()\n      uses: actions/upload-artifact@v4\n      with:\n        name: nupkgs\n        path: bin\n\n  device-tests-android:\n\n    runs-on: ubuntu-latest\n\n    env:\n      WORKLOAD_VERSION: 10.0.103\n\n    steps:\n    - name: checkout\n      uses: actions/checkout@v4\n\n    - name: enable KVM\n      run: |\n        echo 'KERNEL==\"kvm\", GROUP=\"kvm\", MODE=\"0666\", OPTIONS+=\"static_node=kvm\"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules\n        sudo udevadm control --reload-rules\n        sudo udevadm trigger --name-match=kvm\n\n    - name: install .NET\n      uses: actions/setup-dotnet@v4\n      with:\n        dotnet-version: 10.0.x\n\n    - name: cache NuGet packages\n      uses: actions/cache@v4\n      with:\n        path: ~/.nuget/packages\n        key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/*.slnx', '**/Directory.Build.props', '**/Directory.Build.targets') }}\n        restore-keys: |\n          ${{ runner.os }}-nuget-\n\n    - name: install workloads\n      run: dotnet workload install maui-android --version $WORKLOAD_VERSION\n\n    - name: restore .NET tools\n      run: dotnet tool restore\n\n    - name: restore test app\n      run: dotnet msbuild tests/Spice.Tests/Spice.Tests.csproj -t:Restore -p:TargetFramework=net10.0-android -p:RuntimeIdentifier=android-x64\n\n    - name: build test app\n      run: dotnet build tests/Spice.Tests/Spice.Tests.csproj -f net10.0-android -c Release -r android-x64 --no-restore -bl:bin/build-device-tests-android.binlog\n\n    - name: run Android device tests\n      uses: reactivecircus/android-emulator-runner@v2\n      with:\n        api-level: 34\n        target: google_apis\n        arch: x86_64\n        script: dotnet xharness android test --app=\"tests/Spice.Tests/bin/Release/net10.0-android/android-x64/com.jonathanpeppers.spice.tests-Signed.apk\" --package-name=\"com.jonathanpeppers.spice.tests\" --instrumentation=\"com.jonathanpeppers.spice.tests.TestInstrumentation\" --output-directory=bin/device-test-results/android --timeout=00:10:00\n\n    - name: publish test results\n      if: always()\n      uses: actions/upload-artifact@v4\n      with:\n        name: device-test-results-android\n        path: bin/device-test-results/android\n\n  device-tests-ios:\n\n    runs-on: macos-latest\n\n    env:\n      WORKLOAD_VERSION: 10.0.103\n      ValidateXcodeVersion: false\n\n    steps:\n    - name: checkout\n      uses: actions/checkout@v4\n\n    - name: select Xcode version\n      uses: maxim-lobanov/setup-xcode@v1\n      with:\n        xcode-version: latest-stable\n\n    - name: install .NET\n      uses: actions/setup-dotnet@v4\n      with:\n        dotnet-version: 10.0.x\n\n    - name: cache NuGet packages\n      uses: actions/cache@v4\n      with:\n        path: ~/.nuget/packages\n        key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/*.slnx', '**/Directory.Build.props', '**/Directory.Build.targets') }}\n        restore-keys: |\n          ${{ runner.os }}-nuget-\n\n    - name: install workloads\n      run: dotnet workload install maui-ios --version $WORKLOAD_VERSION\n\n    - name: restore .NET tools\n      run: dotnet tool restore\n\n    - name: restore test app\n      run: dotnet msbuild tests/Spice.Tests/Spice.Tests.csproj -t:Restore -p:TargetFramework=net10.0-ios -p:RuntimeIdentifier=iossimulator-arm64\n\n    - name: build test app\n      run: dotnet build tests/Spice.Tests/Spice.Tests.csproj -f net10.0-ios -c Release -r iossimulator-arm64 --no-restore -bl:bin/build-device-tests-ios.binlog\n\n    - name: run iOS device tests\n      run: >\n        dotnet xharness apple test\n        --app=\"tests/Spice.Tests/bin/Release/net10.0-ios/iossimulator-arm64/Spice.Tests.app\"\n        --output-directory=bin/device-test-results/ios\n        --target=ios-simulator-64\n        --timeout=00:15:00\n        --launch-timeout=00:10:00\n        --communication-channel=Network\n\n    - name: collect simulator logs\n      if: always()\n      run: |\n        # Grab the most recent simulator device log\n        UDID=$(xcrun simctl list devices booted -j | python3 -c \"import sys,json; devs=[d for r in json.load(sys.stdin)['devices'].values() for d in r if d['state']=='Booted']; print(devs[0]['udid'] if devs else '')\" 2>/dev/null || true)\n        if [ -n \"$UDID\" ]; then\n          LOG_DIR=\"$HOME/Library/Logs/DiagnosticReports\"\n          mkdir -p bin/device-test-results/ios\n          cp \"$LOG_DIR\"/*.ips bin/device-test-results/ios/ 2>/dev/null || true\n          # Also grab the system log from the simulator\n          xcrun simctl spawn \"$UDID\" log show --last 5m --predicate 'process == \"Spice.Tests\"' > bin/device-test-results/ios/simulator-system.log 2>&1 || true\n        fi\n\n    - name: publish test results\n      if: always()\n      uses: actions/upload-artifact@v4\n      with:\n        name: device-test-results-ios\n        path: bin/device-test-results/ios\n"
  },
  {
    "path": ".gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore\n\n# User-specific files\n*.rsuser\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Mono auto generated files\nmono_crash.*\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\n[Ww][Ii][Nn]32/\n[Aa][Rr][Mm]/\n[Aa][Rr][Mm]64/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n[Ll]ogs/\n\n# Visual Studio 2015/2017 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# Visual Studio 2017 auto generated files\nGenerated\\ Files/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUnit\n*.VisualState.xml\nTestResult.xml\nnunit-*.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# Benchmark Results\nBenchmarkDotNet.Artifacts/\n\n# .NET Core\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n\n# ASP.NET Scaffolding\nScaffoldingReadMe.txt\n\n# StyleCop\nStyleCopReport.xml\n\n# Files built by Visual Studio\n*_i.c\n*_p.c\n*_h.h\n*.ilk\n*.meta\n*.obj\n*.iobj\n*.pch\n*.pdb\n*.ipdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*_wpftmp.csproj\n*.log\n*.tlog\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# Visual Studio Trace Files\n*.e2e\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# AxoCover is a Code Coverage Tool\n.axoCover/*\n!.axoCover/settings.json\n\n# Coverlet is a free, cross platform Code Coverage Tool\ncoverage*.json\ncoverage*.xml\ncoverage*.info\n\n# Visual Studio code coverage results\n*.coverage\n*.coveragexml\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# Note: Comment the next line if you want to checkin your web deploy settings,\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# NuGet Symbol Packages\n*.snupkg\n# The packages folder can be ignored because of Package Restore\n**/[Pp]ackages/*\n# except build/, which is used as an MSBuild target.\n!**/[Pp]ackages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/[Pp]ackages/repositories.config\n# NuGet v3's project.json files produces more ignorable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n*.appx\n*.appxbundle\n*.appxupload\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!?*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\norleans.codegen.cs\n\n# Including strong name files can present a security risk\n# (https://github.com/github/gitignore/pull/2483#issue-259490424)\n#*.snk\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\nServiceFabricBackup/\n*.rptproj.bak\n\n# SQL Server files\n*.mdf\n*.ldf\n*.ndf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n*.rptproj.rsuser\n*- [Bb]ackup.rdl\n*- [Bb]ackup ([0-9]).rdl\n*- [Bb]ackup ([0-9][0-9]).rdl\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\nnode_modules/\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)\n*.vbw\n\n# Visual Studio 6 auto-generated project file (contains which files were open etc.)\n*.vbp\n\n# Visual Studio 6 workspace and project file (working project files containing files to include in project)\n*.dsw\n*.dsp\n\n# Visual Studio 6 technical files \n*.ncb\n*.aps\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# CodeRush personal settings\n.cr/personal\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n\n# Cake - Uncomment if you are using it\n# tools/**\n# !tools/packages.config\n\n# Tabs Studio\n*.tss\n\n# Telerik's JustMock configuration file\n*.jmconfig\n\n# BizTalk build output\n*.btp.cs\n*.btm.cs\n*.odx.cs\n*.xsd.cs\n\n# OpenCover UI analysis results\nOpenCover/\n\n# Azure Stream Analytics local run output\nASALocalRun/\n\n# MSBuild Binary and Structured Log\n*.binlog\n\n# NVidia Nsight GPU debugger configuration file\n*.nvuser\n\n# MFractors (Xamarin productivity tool) working folder\n.mfractor/\n\n# Local History for Visual Studio\n.localhistory/\n\n# Visual Studio History (VSHistory) files\n.vshistory/\n\n# BeatPulse healthcheck temp database\nhealthchecksdb\n\n# Backup folder for Package Reference Convert tool in Visual Studio 2017\nMigrationBackup/\n\n# Ionide (cross platform F# VS Code tools) working folder\n.ionide/\n\n# Fody - auto-generated XML schema\nFodyWeavers.xsd\n\n# VS Code files for those working on multiple tools\n.vscode/*\n!.vscode/settings.json\n!.vscode/tasks.json\n!.vscode/launch.json\n!.vscode/extensions.json\n*.code-workspace\n\n# Local History for Visual Studio Code\n.history/\n\n# Windows Installer files from build outputs\n*.cab\n*.msi\n*.msix\n*.msm\n*.msp\n\n# JetBrains Rider\n*.sln.iml\n\n# macOS\n.DS_Store\n\n.idea/\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n    \"dotnet.defaultSolution\": \"spice.sln\"\n}"
  },
  {
    "path": "Directory.Build.props",
    "content": "<Project>\n  <PropertyGroup>\n    <!-- Projects have to opt in -->\n    <IsPackable>false</IsPackable>\n    <Version>0.2.0</Version>\n    <PackageVersion>$(Version)-beta.1</PackageVersion>\n    <Authors>Jonathan Peppers</Authors>\n    <PackageProjectUrl>https://github.com/jonathanpeppers/spice</PackageProjectUrl>\n    <PackageTags>.NET C# MAUI Mobile Android iOS</PackageTags>\n    <PackageLicenseFile>LICENSE</PackageLicenseFile>\n    <PackageReadmeFile>README.md</PackageReadmeFile>\n    <PackageIcon>icon.png</PackageIcon>\n    <PackageOutputPath>$(MSBuildThisFileDirectory)bin/$(Configuration)/</PackageOutputPath>\n    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\n    <!-- Show all trimmer warnings/errors in this repo, not just one per assembly -->\n    <TrimmerSingleWarn>false</TrimmerSingleWarn>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "Directory.Build.targets",
    "content": "<Project>\n  <PropertyGroup>\n    <!-- Weird fix for VS Mac -->\n    <CreatePackage Condition=\" '$(TargetFramework)' == 'net10.0-ios' \">false</CreatePackage>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Update=\"Microsoft.Maui.Resizetizer\" Version=\"10.0.40\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2023 Jonathan Peppers\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "NuGet.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <packageSources>\n    <clear />\n    <add key=\"nuget\" value=\"https://api.nuget.org/v3/index.json\" />\n    <add key=\"dotnet-eng\" value=\"https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json\" />\n  </packageSources>\n</configuration>\n"
  },
  {
    "path": "README.md",
    "content": "# Spice 🌶, a spicy cross-platform UI framework!\n\nA prototype (and design) of API minimalism for mobile.\n\nIf you like this idea, star for approval! Read on for details!\n\n![Spice running on iOS and Android](docs/spice.png)\n\n## Getting Started\n\nSimply install the template:\n\n```sh\ndotnet new install Spice.Templates\n```\n\nCreate either a plain Spice project, or a hybrid \"Spice+Blazor\" project:\n\n```sh\ndotnet new spice\n# Or if you want hybrid/web support\ndotnet new spice-blazor\n```\n\nOr use the project template in Visual Studio:\n\n![Screenshot of the Spice project template in Visual Studio](docs/vs-template.png)\n\nBuild it as you would for other .NET MAUI projects:\n\n```sh\ndotnet build\n# To run on Android\ndotnet build -f net10.0-android -t:Run\n# To run on iOS\ndotnet build -f net10.0-ios -t:Run\n```\n\nOf course, you can also just open the project in Visual Studio and hit F5.\n\n## Startup Time & App Size\n\nIn comparison to a `dotnet new maui` project, I created a Spice\nproject with the same layouts and optimized settings for both project\ntypes. (`AndroidLinkMode=r8`, etc.)\n\nApp size of a single-architecture `.apk`, built for `android-arm64`:\n\n![Graph of an app size comparison](docs/appsize.png)\n\nThe average startup time of 10 runs on a Pixel 5:\n\n![Graph of a startup comparison](docs/startup.png)\n\nThis gives you an idea of how much \"stuff\" is in .NET MAUI.\n\nIn some respects the above comparison isn't completely fair, as Spice\n🌶 has very few features. However, Spice 🌶 is [fully\ntrimmable][trimming], and so a `Release` build of an app without\n`Spice.Button` will have the code for `Spice.Button` trimmed away. It\nwill be quite difficult for .NET MAUI to become [fully\ntrimmable][trimming] -- due to the nature of XAML, data-binding, and\nother System.Reflection usage in the framework.\n\n[trimming]: https://learn.microsoft.com/dotnet/core/deploying/trimming/prepare-libraries-for-trimming\n\n## Background & Motivation\n\nIn reviewing, many of the *cool* UI frameworks for mobile:\n\n* [Flutter](https://flutter.dev)\n* [SwiftUI](https://developer.apple.com/xcode/swiftui/)\n* [Jetpack Compose](https://developer.android.com/jetpack/compose)\n* [Fabulous](https://fabulous.dev/)\n* [Comet](https://github.com/dotnet/Comet)\n* An, of course, [.NET MAUI](https://dotnet.microsoft.com/apps/maui)!\n\nLooking at what apps look like today -- it seems like bunch of\nrigamarole to me. Can we build mobile applications *without* design\npatterns?\n\nThe idea is we could build apps in a simple way, in a similar vein as\n[minimal APIs in ASP.NET Core][minimal-apis] but for mobile & maybe\none day desktop:\n\n```csharp\npublic class App : Application\n{\n    public App()\n    {\n        int count = 0;\n    \n        var label = new Label\n        {\n            Text = \"Hello, Spice 🌶\",\n        };\n    \n        var button = new Button\n        {\n            Text = \"Click Me\",\n            Clicked = _ => label.Text = $\"Times: {++count}\"\n        };\n    \n        Main = new StackLayout { label, button };\n    }\n}\n```\n\nThese \"view\" types are mostly just [POCOs][poco].\n\nThus you can easily write unit tests in a vanilla `net10.0` Xunit\nproject, such as:\n\n```csharp\n[Fact]\npublic void Application()\n{\n    var app = new App();\n    var label = (Label)app.Main.Children[0];\n    var button = (Button)app.Main.Children[1];\n\n    button.Clicked(button);\n    Assert.Equal(\"Times: 1\", label.Text);\n\n    button.Clicked(button);\n    Assert.Equal(\"Times: 2\", label.Text);\n}\n```\n\nThe above views in a `net10.0` project are not real UI, while\n`net10.0-android` and `net10.0-ios` projects get the full\nimplementations that actually *do* something on screen.\n\nSo for example, adding `App` to the screen on Android:\n\n```csharp\nprotected override void OnCreate(Bundle? savedInstanceState)\n{\n    base.OnCreate(savedInstanceState);\n\n    SetContentView(new App());\n}\n```\n\nAnd on iOS:\n\n```csharp\nvar vc = new UIViewController();\nvc.View.AddSubview(new App());\nWindow.RootViewController = vc;\n```\n\n`App` is a native view on both platforms. You just add it to an the\nscreen as you would any other control or view. This can be mix &\nmatched with regular iOS & Android UI because Spice 🌶 views are just\nnative views.\n\n[poco]: https://en.wikipedia.org/wiki/Plain_old_CLR_object\n[minimal-apis]: https://learn.microsoft.com/aspnet/core/fundamentals/minimal-apis\n\n## *NEW* Blazor Support\n\nCurrently, Blazor/Hybrid apps are strongly tied to .NET MAUI. The\nimplementation is basically working with the plumbing of the native\n\"web view\" on each platform. So we could have implemented\n`BlazorWebView` to be used in \"plain\" `dotnet new android` or\n`dotnet new ios` apps. For now, I've migrated some of the source code\nfrom `BlazorWebView` from .NET MAUI to Spice 🌶, making it available\nas a new control:\n\n```csharp\npublic class App : Application\n{\n    public App()\n    {\n        Main = new BlazorWebView\n        {\n            HostPage = \"wwwroot/index.html\",\n            RootComponents =\n            {\n                new RootComponent { Selector = \"#app\", ComponentType = typeof(Main) }\n            },\n        };\n    }\n}\n```\n\nFrom here, you can write `Index.razor` as the Blazor you know and love:\n\n```razor\n@page \"/\"\n\n<h1>Hello, world!</h1>\n\nWelcome to your new app.\n```\n\nTo arrive at Blazor web content inside iOS/Android apps:\n\n![Screenshot of Blazor app on iOS](docs/blazor.png)\n\nThis setup might be particularly useful if you want web content to\ntake full control of the screen with minimal native controls. No need\nfor the app size / startup overhead of .NET MAUI if you don't actually\nhave native content?\n\n## Scope\n\n* No XAML. No DI. No MVVM. No MVC. No data-binding. No System.Reflection.\n  * *Do we need these things?*\n* Target iOS & Android only to start.\n* Implement only the simplest controls.\n* The native platforms do their own layout.\n* Document how to author custom controls.\n* Leverage C# Hot Reload for fast development.\n* Measure startup time & app size.\n* Profit?\n\nBenefits of this approach are full support for [trimming][trimming]\nand eventually [NativeAOT][nativeaot] if it comes to mobile one day. 😉\n\n[nativeaot]: https://learn.microsoft.com/dotnet/core/deploying/native-aot/\n\n## Thoughts on .NET MAUI\n\n.NET MAUI is great. XAML is great. Think of this idea as a \"mini\"\nMAUI.\n\nSpice 🌶 will even leverage various parts of .NET MAUI:\n\n* The iOS and Android workloads for .NET.\n* The .NET MAUI \"Single Project\" system.\n* The .NET MAUI \"Asset\" system, aka Resizetizer.\n* Microsoft.Maui.Graphics for primitives like `Color`.\n\nAnd, of course, you should be able to use Microsoft.Maui.Essentials by\nopting in with `UseMauiEssentials=true`.\n\nIt is an achievement in itself that I was able to invent my own UI\nframework and pick and choose the pieces of .NET MAUI that made sense\nfor my framework.\n\n## Implemented Controls\n\n* `View`: maps to `Android.Views.View` and `UIKit.View`.\n* `Label`: maps to `Android.Widget.TextView` and `UIKit.UILabel`\n* `Button`: maps to `Android.Widget.Button` and `UIKit.UIButton`\n* `StackLayout`: maps to `Android.Widget.LinearLayout` and `UIKit.UIStackView`\n* `Image`: maps to `Android.Widget.ImageView` and `UIKit.UIImageView`\n* `Entry`: maps to `Android.Widget.EditText` and `UIKit.UITextField`\n* `WebView`: maps to `Android.Webkit.WebView` and `WebKit.WKWebView`\n* `BlazorWebView` extends `WebView` adding support for Blazor. Use the\n  `spice-blazor` template to get started.\n\n## Custom Controls\n\nLet's review an implementation for `Image`.\n\nFirst, you can write the cross-platform part for a vanilla `net10.0`\nclass library:\n\n```csharp\npublic partial class Image : View\n{\n    [ObservableProperty]\n    string _source = \"\";\n}\n```\n\n`[ObservableProperty]` comes from the [MVVM Community\nToolkit][observable] -- I made use of it for simplicity. It will\nautomatically generate various `partial` methods,\n`INotifyPropertyChanged`, and a `public` property named `Source`.\n\nWe can implement the control on Android, such as:\n\n```csharp\npublic partial class Image\n{\n    public static implicit operator ImageView(Image image) => image.NativeView;\n\n    public Image() : base(c => new ImageView(c)) { }\n\n    public new ImageView NativeView => (ImageView)_nativeView.Value;\n\n    partial void OnSourceChanged(string value)\n    {\n        // NOTE: the real implementation is in Java for performance reasons\n        var image = NativeView;\n        var context = image.Context;\n        int id = context!.Resources!.GetIdentifier(value, \"drawable\", context.PackageName);\n        if (id != 0) \n        {\n            image.SetImageResource(id);\n        }\n    }\n}\n```\n\nThis code takes the name of an image, and looks up a drawable with the\nsame name. This also leverages the .NET MAUI asset system, so a\n`spice.svg` can simply be loaded via `new Image { Source = \"spice\" }`.\n\nLastly, the iOS implementation:\n\n```csharp\npublic partial class Image\n{\n    public static implicit operator UIImageView(Image image) => image.NativeView;\n\n    public Image() : base(_ => new UIImageView { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n    public new UIImageView NativeView => (UIImageView)_nativeView.Value;\n\n    partial void OnSourceChanged(string value) => NativeView.Image = UIImage.FromFile($\"{value}.png\");\n}\n```\n\nThis implementation is a bit simpler, all we have to do is call\n`UIImage.FromFile()` and make sure to append a `.png` file extension\nthat the MAUI asset system generates.\n\nNow, let's say you don't want to create a control from scratch.\nImagine a \"ghost button\":\n\n```csharp\nclass GhostButton : Button\n{\n    public GhostButton() => NativeView.Alpha = 0.5f;\n}\n```\n\nIn this case, the `NativeView` property returns the underlying\n`Android.Widget.Button` or `UIKit.Button` that both conveniently have\nan `Alpha` property that ranges from 0.0f to 1.0f. The same code\nworks on both platforms!\n\nImagine the APIs were different, you could instead do:\n\n```csharp\nclass GhostButton : Button\n{\n    public GhostButton\n    {\n#if ANDROID\n        NativeView.SomeAndroidAPI(0.5f);\n#elif IOS\n        NativeView.SomeiOSAPI(0.5f);\n#endif\n    }\n}\n```\n\nAccessing the native views don't require any weird design patterns.\nJust `#if` as you please.\n\n[observable]: https://learn.microsoft.com/dotnet/communitytoolkit/mvvm/generators/observableproperty\n\n## Hot Reload\n\nC# Hot Reload (in Visual Studio) works fine, as it does for vanilla .NET\niOS/Android apps:\n\n![Hot Reload Demo](docs/hotreload.gif)\n\nNote that this only works for `Button.Clicked` because the method is\ninvoked when you click. If the method that was changed was already\nrun, *something* has to force it to run again.\n[`MetadataUpdateHandler`][muh] is the solution to this problem, giving\nframeworks a way to \"reload themselves\" for Hot Reload.\n\nUnfortunately, [`MetadataUpdateHandler`][muh] does not currently work\nfor non-MAUI apps in Visual Studio 2022 17.5:\n\n```csharp\n[assembly: System.Reflection.Metadata.MetadataUpdateHandler(typeof(HotReload))]\n\nstatic class HotReload\n{\n    static void UpdateApplication(Type[]? updatedTypes)\n    {\n        if (updatedTypes == null)\n            return;\n        foreach (var type in updatedTypes)\n        {\n            // Do something with the type\n            Console.WriteLine(\"UpdateApplication: \" + type);\n        }\n    }\n}\n```\n\nThe above code works fine in a `dotnet new maui` app, but not a\n`dotnet new spice` or `dotnet new android` application.\n\nAnd so we can't add proper functionality for reloading `ctor`'s of\nSpice 🌶 views. The general idea is we could recreate the `App` class and\nreplace the views on screen. We could also create Android activities\nor iOS view controllers if necessary.\n\nHopefully, we can implement this for a future release of Visual Studio.\n\n[muh]: https://learn.microsoft.com/dotnet/api/system.reflection.metadata.metadataupdatehandlerattribute\n"
  },
  {
    "path": "docs/DATA-BINDING-SPEC.md",
    "content": "# Data-Binding in Spice 🌶\n\n**Status:** Design Specification  \n**Created:** February 2026\n\n## Overview\n\nSpice views already extend `ObservableObject` (via CommunityToolkit.Mvvm), so every `View`,\n`Label`, `CheckBox`, etc. implements `INotifyPropertyChanged` out of the box. This spec\nproposes a small `Bind()` helper that wires `PropertyChanged` subscriptions with less\nboilerplate — while staying NativeAOT safe, trimmer safe, and reflection-free.\n\n## What We Have Today\n\nDirect lambda assignments — explicit, transparent, zero magic:\n\n```csharp\npublic class App : Application\n{\n    public App()\n    {\n        int count = 0;\n        var label = new Label { Text = \"Hello, Spice 🌶\" };\n        var button = new Button\n        {\n            Clicked = _ => label.Text = $\"Times: {++count}\"\n        };\n        Main = new StackLayout { label, button };\n    }\n}\n```\n\nFor larger UIs, a ViewModel with manual `PropertyChanged` wiring works but gets verbose:\n\n```csharp\nvar vm = new TodoViewModel();\nvar titleLabel = new Label();\nvar countLabel = new Label();\nvar checkbox = new CheckBox();\n\nvm.PropertyChanged += (s, e) =>\n{\n    if (e.PropertyName == nameof(TodoViewModel.Title))\n        titleLabel.Text = vm.Title;\n    else if (e.PropertyName == nameof(TodoViewModel.Count))\n        countLabel.Text = $\"Count: {vm.Count}\";\n    else if (e.PropertyName == nameof(TodoViewModel.IsCompleted))\n        checkbox.IsChecked = vm.IsCompleted;\n};\n\n// Reverse: view → viewmodel (Action<CheckBox> property, not an event)\ncheckbox.CheckedChanged = cb => vm.IsCompleted = cb.IsChecked;\n\nMain = new StackLayout { titleLabel, countLabel, checkbox };\n```\n\n## Proposed: `Bind()` Helper\n\n### Core API\n\nOne method, no expression trees, no reflection:\n\n```csharp\nnamespace Spice;\n\npublic static class BindingExtensions\n{\n    /// <summary>\n    /// One-way binding: subscribes to source.PropertyChanged and invokes\n    /// <paramref name=\"apply\"/> whenever the named property changes.\n    /// Sets the initial value immediately.\n    /// </summary>\n    public static IDisposable Bind<TSource, TValue>(\n        this TSource source,\n        string propertyName,\n        Func<TSource, TValue> getter,\n        Action<TValue> apply)\n        where TSource : INotifyPropertyChanged\n    {\n        // Sync initial value\n        apply(getter(source));\n\n        PropertyChangedEventHandler handler = (_, e) =>\n        {\n            if (e.PropertyName == propertyName)\n                apply(getter(source));\n        };\n        source.PropertyChanged += handler;\n\n        return new BindingSubscription(source, handler);\n    }\n}\n\ninternal sealed class BindingSubscription : IDisposable\n{\n    private readonly INotifyPropertyChanged _source;\n    private readonly PropertyChangedEventHandler _handler;\n    private bool _disposed;\n\n    public BindingSubscription(INotifyPropertyChanged source, PropertyChangedEventHandler handler)\n    {\n        _source = source;\n        _handler = handler;\n    }\n\n    public void Dispose()\n    {\n        if (!_disposed)\n        {\n            _source.PropertyChanged -= _handler;\n            _disposed = true;\n        }\n    }\n}\n```\n\nUsage with `nameof()` keeps everything compile-time safe:\n\n```csharp\nvm.Bind(nameof(vm.Title), v => v.Title, text => titleLabel.Text = text);\nvm.Bind(nameof(vm.Count), v => v.Count, n => countLabel.Text = $\"Count: {n}\");\n```\n\n### Why Not `Expression<Func<TSource, TValue>>`?\n\nAn expression-tree overload like `vm.Bind(x => x.Title, ...)` is ergonomically nicer, but\n`Expression.Compile()` internally uses `Reflection.Emit` (or an interpreter on .NET 8+).\nFor a library that promises NativeAOT safety, introducing expression trees is a real trade-off:\n\n- ✅ Works on .NET 8+ NativeAOT via the built-in interpreter\n- ⚠️ Slower than a plain `Func<>` (interpreter overhead + one-time compile cost)\n- ⚠️ Adds `System.Linq.Expressions` as a de facto dependency\n- ❌ Fails on older NativeAOT runtimes without the interpreter\n\nIf the convenience is deemed worth it, an **optional** overload can be added alongside\nthe `nameof` version — never as the only option:\n\n```csharp\n// Optional convenience overload (expression tree)\npublic static IDisposable Bind<TSource, TValue>(\n    this TSource source,\n    Expression<Func<TSource, TValue>> propertySelector,\n    Action<TValue> apply)\n    where TSource : INotifyPropertyChanged\n{\n    string name = ((MemberExpression)propertySelector.Body).Member.Name;\n    var getter = propertySelector.Compile();\n    return source.Bind(name, getter, apply);\n}\n```\n\n### Two-Way Binding\n\nSince Spice views **already implement `INotifyPropertyChanged`**, true two-way binding is\nstraightforward — subscribe in both directions with a guard to prevent infinite loops:\n\n```csharp\npublic static IDisposable BindTwoWay<TSource, TValue>(\n    this TSource source,\n    string sourceProperty,\n    Func<TSource, TValue> sourceGetter,\n    Action<TSource, TValue> sourceSetter,\n    INotifyPropertyChanged target,\n    string targetProperty,\n    Func<TValue> targetGetter,\n    Action<TValue> targetSetter)\n    where TSource : INotifyPropertyChanged\n{\n    bool updating = false;\n\n    targetSetter(sourceGetter(source)); // initial sync\n\n    PropertyChangedEventHandler sourceHandler = (_, e) =>\n    {\n        if (!updating && e.PropertyName == sourceProperty)\n        {\n            updating = true;\n            targetSetter(sourceGetter(source));\n            updating = false;\n        }\n    };\n\n    PropertyChangedEventHandler targetHandler = (_, e) =>\n    {\n        if (!updating && e.PropertyName == targetProperty)\n        {\n            updating = true;\n            sourceSetter(source, targetGetter());\n            updating = false;\n        }\n    };\n\n    source.PropertyChanged += sourceHandler;\n    target.PropertyChanged += targetHandler;\n\n    return new TwoWayBindingSubscription(source, sourceHandler, target, targetHandler);\n}\n```\n\nUsage — ViewModel ↔ Entry (both are ObservableObjects):\n\n```csharp\nvm.BindTwoWay(\n    nameof(vm.Username), v => v.Username, (v, val) => v.Username = val,\n    usernameEntry,\n    nameof(Entry.Text), () => usernameEntry.Text, val => usernameEntry.Text = val);\n```\n\nThis is verbose, which is intentional — it makes data flow explicit. For common cases,\nconvenience overloads or a fluent builder could be added later.\n\n## Usage Examples\n\n### Simple One-Way\n\n```csharp\npublic class CounterApp : Application\n{\n    public CounterApp()\n    {\n        var vm = new CounterViewModel();\n        var label = new Label();\n        var button = new Button\n        {\n            Text = \"Increment\",\n            Clicked = _ => vm.Count++\n        };\n\n        vm.Bind(nameof(vm.Count), v => v.Count, n => label.Text = $\"Count: {n}\");\n\n        Main = new StackLayout { label, button };\n    }\n}\n```\n\n### CollectionView with Per-Item Binding\n\nFor CollectionView recycling, wrap the template in a custom `IDisposable` View:\n\n```csharp\npublic class TodoItemView : StackLayout, IDisposable\n{\n    private IDisposable? _titleBinding;\n\n    public TodoItemView(TodoItem item)\n    {\n        var label = new Label();\n        var checkbox = new CheckBox();\n\n        // One-way: model → view\n        _titleBinding = item.Bind(nameof(item.Title), t => t.Title, \n            text => label.Text = text);\n        item.Bind(nameof(item.IsCompleted), t => t.IsCompleted,\n            done => checkbox.IsChecked = done);\n\n        // Reverse: view → model\n        checkbox.CheckedChanged = cb => item.IsCompleted = cb.IsChecked;\n\n        Children.Add(new StackLayout { label, checkbox });\n    }\n\n    public void Dispose()\n    {\n        _titleBinding?.Dispose();\n    }\n}\n\nvar collectionView = new CollectionView\n{\n    ItemsSource = vm.Items,\n    ItemTemplate = item => new TodoItemView((TodoItem)item)\n};\n```\n\nWhen the view is recycled, `Dispose()` will be called and subscriptions cleaned up.\nSee [VIEW-LIFECYCLE-SPEC.md](./VIEW-LIFECYCLE-SPEC.md) for details.\n\n## Memory Management\n\n`Bind()` returns `IDisposable`. In most Spice apps, bindings live as long as the view, so\ndisposal is unnecessary. For short-lived views bound to long-lived sources, dispose explicitly:\n\n```csharp\nvar binding = vm.Bind(nameof(vm.Title), v => v.Title, text => label.Text = text);\n// ...\nbinding.Dispose(); // unsubscribes from PropertyChanged\n```\n\nMultiple bindings can be grouped with `CompositeDisposable` or a simple list:\n\n```csharp\nvar bindings = new List<IDisposable>\n{\n    vm.Bind(nameof(vm.Title), v => v.Title, t => label.Text = t),\n    vm.Bind(nameof(vm.Count), v => v.Count, n => countLabel.Text = $\"{n}\"),\n};\n\n// Dispose all at once\nforeach (var b in bindings) b.Dispose();\n```\n\n## Alternatives Considered\n\n| Approach | Pros | Cons |\n|---|---|---|\n| **Manual `PropertyChanged` (status quo)** | Zero abstraction, fully explicit | Verbose, error-prone string matching |\n| **`nameof` + `Func<>` (this proposal)** | NativeAOT safe, no new dependencies | Property name repeated in `nameof()` call |\n| **`Expression<Func<>>` only** | Ergonomic (`x => x.Title`) | `Expression.Compile()` has NativeAOT caveats |\n| **Source generator** | Zero runtime cost, best ergonomics | Significant implementation effort, new tooling |\n| **CallerArgumentExpression hack** | No expression trees | Fragile string parsing, breaks with refactoring |\n\nThe `nameof` + `Func<>` approach is the right default for Spice: zero new dependencies,\ntruly NativeAOT safe, and the `nameof()` repetition is a minor cost for full transparency.\n\n## Future Work\n\n1. **View lifecycle** — Add `Detached` event to `View` for CollectionView recycling cleanup\n2. **Source generator** — Compile-time codegen to eliminate `nameof()` boilerplate\n3. **Value converters** — `Bind(..., converter: boolToColor)` for transformations\n\n## Summary\n\n- Spice views already implement `INotifyPropertyChanged` — leverage it\n- `Bind()` is a thin helper over `PropertyChanged`, not a framework\n- `nameof()` + `Func<>` = truly NativeAOT safe, no expression trees required\n- Two-way binding works because both sides are `ObservableObject`\n- Expression-tree overload is opt-in, not the default\n"
  },
  {
    "path": "docs/MAUI-CONTROLS-COMPARISON.md",
    "content": "# .NET MAUI Controls vs Spice Implementation Status\n\nThis document compares the stable/supported controls from .NET MAUI with what is currently implemented in Spice.\n\n## Pages\n\n| MAUI Control | Implemented in Spice | Should Implement? | Notes |\n|--------------|---------------------|-------------------|-------|\n| ContentPage | ❌ No | ❌ No | Spice uses a different architecture without MAUI Controls |\n| FlyoutPage | ❌ No | ❌ No | Spice uses a different architecture without MAUI Controls |\n| NavigationPage | ❌ No | ❌ No | Spice uses a different architecture without MAUI Controls |\n| TabbedPage | ❌ No | ❌ No | Spice uses a different architecture without MAUI Controls |\n\n## Layouts\n\n| MAUI Control | Implemented in Spice | Should Implement? | Notes |\n|--------------|---------------------|-------------------|-------|\n| AbsoluteLayout | ❌ No | ❌ No | Rare use case, complex |\n| BindableLayout | ❌ No | ❌ No | Binding-focused pattern |\n| FlexLayout | ❌ No | 🟡 Maybe | Powerful but complex CSS flexbox |\n| Grid | ✅ Yes | ✅ Done | Essential for complex layouts |\n| HorizontalStackLayout | ❌ No | ❌ No | StackLayout with Horizontal orientation |\n| StackLayout | ✅ Yes | ✅ Done | Fully implemented |\n| VerticalStackLayout | ❌ No | ❌ No | StackLayout with Vertical orientation |\n\n## Views\n\n| MAUI Control | Implemented in Spice | Should Implement? | Notes |\n|--------------|---------------------|-------------------|-------|\n| ActivityIndicator | ✅ Yes | ✅ Done | Loading spinner - very common |\n| BlazorWebView | ✅ Yes | ✅ Done | Extends `WebView` in Blazor/ folders |\n| Border | ✅ Yes | ✅ Done | Useful for rounded corners/borders |\n| BoxView | ✅ Yes | ✅ Done | Colored rectangles - useful for dividers |\n| Button | ✅ Yes | ✅ Done | Fully implemented |\n| CarouselView | ❌ No | ❌ No | Complex, less common |\n| CheckBox | ✅ Yes | ✅ Done | Standard checkbox input |\n| CollectionView | ✅ Yes | ✅ Done | Powerful grid/list control |\n| ContentView | ✅ Yes | ✅ Done | Custom control composition |\n| DatePicker | ✅ Yes | ✅ Done | Date selection - common in forms |\n| Editor | ✅ Yes | ✅ Done | Multi-line text input |\n| Ellipse | ❌ No | 🟢 Maybe | Shape control - can use Image |\n| Entry | ✅ Yes | ✅ Done | Single-line text input |\n| Frame | ❌ No | ❌ No | Superseded by Border |\n| GraphicsView | ❌ No | ❌ No | Advanced - Microsoft.Maui.Graphics available |\n| HybridWebView | ❌ No | ❌ No | Specialized, newer control |\n| Image | ✅ Yes | ✅ Done | Fully implemented |\n| ImageButton | ✅ Yes | ✅ Done | Common pattern (Image + tap) |\n| IndicatorView | ❌ No | ❌ No | Depends on CarouselView |\n| Label | ✅ Yes | ✅ Done | Fully implemented |\n| Line | ❌ No | ❌ No | Shape control - can use BoxView |\n| ListView | ❌ No | 🟡 Yes | Scrollable lists - very common |\n| Map | ❌ No | ❌ No | External dependency |\n| Path | ❌ No | ❌ No | Complex shapes - can use Image |\n| Picker | ✅ Yes | ✅ Done | Dropdown selection - essential |\n| Polygon | ❌ No | ❌ No | Shape control - can use Image |\n| Polyline | ❌ No | ❌ No | Shape control - can use Image |\n| ProgressBar | ✅ Yes | ✅ Done | Progress display - common |\n| RadioButton | ✅ Yes | ✅ Done | Single selection from a group; uses cross-platform GroupName (no Android RadioGroup) because iOS lacks a native radio button |\n| Rectangle | ❌ No | 🟢 Maybe | Shape control - BoxView covers this |\n| RefreshView | ✅ Yes | ✅ Done | Pull-to-refresh wrapper |\n| RoundRectangle | ❌ No | ❌ No | Border can handle this |\n| ScrollView | ✅ Yes | ✅ Done | Fully implemented |\n| SearchBar | ✅ Yes | ✅ Done | Search input with search button |\n| Slider | ✅ Yes | ✅ Done | Range selection - common |\n| Stepper | ❌ No | ❌ No | Rare, can use buttons + label |\n| SwipeView | ✅ Yes | ✅ Done | Swipe actions - nice UX feature |\n| Switch | ✅ Yes | ✅ Done | Toggle control - essential |\n| TableView | ❌ No | ❌ No | Settings-style list (less common) |\n| TimePicker | ✅ Yes | ✅ Done | Time selection - common in forms |\n| TitleBar | ❌ No | ❌ No | Desktop-focused |\n| TwoPaneView | ❌ No | ❌ No | Foldable-specific |\n| WebView | ✅ Yes | ✅ Done | Fully implemented |\n\n## Summary\n\n**Implemented: 26 / 60+ controls**\n\n### Spice Controls (Core)\n- ✅ ActivityIndicator\n- ✅ Application\n- ✅ Border\n- ✅ BoxView\n- ✅ Button\n- ✅ CheckBox\n- ✅ CollectionView\n- ✅ ContentView\n- ✅ DatePicker\n- ✅ Editor (multi-line text)\n- ✅ Entry (single-line text)\n- ✅ Grid\n- ✅ Image\n- ✅ ImageButton\n- ✅ Label\n- ✅ Picker\n- ✅ ProgressBar\n- ✅ RadioButton\n- ✅ RefreshView\n- ✅ ScrollView\n- ✅ SearchBar\n- ✅ Slider\n- ✅ StackLayout\n- ✅ SwipeView\n- ✅ Switch (toggle control)\n- ✅ TimePicker (time selection)\n- ✅ View (base class)\n- ✅ WebView\n- ✅ BlazorWebView (Blazor-specific)\n\n### Supporting Types\n- LayoutAlignment (enums for alignment)\n- LayoutOptions (alignment with expansion)\n- Orientation (horizontal/vertical)\n- RootComponent (Blazor)\n- SelectionMode (selection in lists)\n- SwipeBehaviorOnInvoked, SwipeDirection, SwipeItem, SwipeItems, SwipeMode (swipe gesture support)\n\n### Key Differences\n- **No XAML**: Spice uses POCOs, not XAML markup\n- **No Data Binding**: No `System.Reflection` or binding infrastructure\n- **No MVVM**: Direct code, no ViewModels required\n- **Partial Class Pattern**: Each control has cross-platform Core + iOS + Android partials\n- **Minimal Dependencies**: Only uses `Microsoft.Maui.Graphics` (Color) and MAUI's SingleProject\n\n### Platform Mappings\n\n#### iOS (UIKit)\n- ActivityIndicator → UIActivityIndicatorView\n- Border → UIView (with CALayer border)\n- BoxView → UIView\n- Button → UIButton\n- CheckBox → UIButton (with checkmark styling)\n- CollectionView → UICollectionView\n- ContentView → UIView\n- DatePicker → UIDatePicker\n- Editor → UITextView\n- Entry → UITextField\n- Grid → Custom constraint-based layout\n- Image → UIImageView\n- ImageButton → UIButton\n- Label → UILabel\n- Picker → UIPickerView\n- ProgressBar → UIProgressView\n- RadioButton → UIButton (with circle/circle.fill SF Symbols; cross-platform GroupName for exclusivity)\n- RefreshView → UIView with UIRefreshControl\n- ScrollView → UIScrollView\n- SearchBar → UISearchBar\n- Slider → UISlider\n- StackLayout → UIStackView\n- SwipeView → UIView with gesture recognizers\n- Switch → UISwitch\n- TimePicker → UIDatePicker (Mode = Time)\n- WebView → WKWebView\n\n#### Android (Android Widgets)\n- ActivityIndicator → ProgressBar (indeterminate)\n- Border → FrameLayout (with GradientDrawable background)\n- BoxView → View\n- Button → AppCompatButton\n- CheckBox → CheckBox\n- CollectionView → AndroidX.RecyclerView.Widget.RecyclerView\n- ContentView → FrameLayout\n- DatePicker → DatePickerDialog\n- Editor → EditText (multiline)\n- Entry → AppCompatEditText\n- Grid → GridLayout\n- Image → AppCompatImageView\n- ImageButton → ImageButton\n- Label → AppCompatTextView\n- Picker → Spinner\n- ProgressBar → ProgressBar\n- RadioButton → Android.Widget.RadioButton (cross-platform GroupName for exclusivity, not RadioGroup)\n- RefreshView → AndroidX.SwipeRefreshLayout.Widget.SwipeRefreshLayout\n- ScrollView → ScrollView / HorizontalScrollView\n- SearchBar → SearchView\n- Slider → SeekBar\n- StackLayout → LinearLayout\n- SwipeView → Custom view with gesture detection\n- Switch → SwitchCompat\n- TimePicker → TimePickerDialog\n- WebView → WebView\n\n---\n\n## MAUI View/VisualElement Properties vs Spice View\n\nThis section compares the properties available on MAUI's `View` class (which inherits from `VisualElement`, `NavigableElement`, `Element`, and `BindableObject`) with Spice's `View` base class.\n\n### Layout & Sizing Properties\n\n| MAUI Property | Spice Implementation | Should Implement? | Notes |\n|--------------|---------------------|-------------------|-------|\n| Width | ✅ Yes | ✅ Done | Read-only - returns actual rendered width |\n| Height | ✅ Yes | ✅ Done | Read-only - returns actual rendered height |\n| WidthRequest | ✅ Yes | ✅ Done | Desired width - essential for sizing |\n| HeightRequest | ✅ Yes | ✅ Done | Desired height - essential for sizing |\n| MinimumWidthRequest | ❌ No | 🟡 Maybe | Useful for responsive layouts |\n| MinimumHeightRequest | ❌ No | 🟡 Maybe | Useful for responsive layouts |\n| MaximumWidthRequest | ❌ No | 🟡 Maybe | Useful for responsive layouts |\n| MaximumHeightRequest | ❌ No | 🟡 Maybe | Useful for responsive layouts |\n| HorizontalOptions | ✅ Yes | ✅ Done | Spice: `HorizontalOptions` (LayoutOptions) |\n| VerticalOptions | ✅ Yes | ✅ Done | Spice: `VerticalOptions` (LayoutOptions) |\n| Margin | ✅ Yes | ✅ Done | Outer spacing using Thickness struct |\n| Bounds | ❌ No | ❌ No | Read-only - internal layout info |\n| Frame | ❌ No | ❌ No | Read-only - screen position |\n| DesiredSize | ❌ No | ❌ No | Read-only - layout system internal |\n\n### Alignment Properties\n\n| MAUI Property | Spice Implementation | Should Implement? | Notes |\n|--------------|---------------------|-------------------|-------|\n| HorizontalOptions (MAUI) | ✅ Yes | ✅ Done | Spice: `HorizontalOptions` (LayoutOptions) |\n| VerticalOptions (MAUI) | ✅ Yes | ✅ Done | Spice: `VerticalOptions` (LayoutOptions) |\n\n### Appearance Properties\n\n| MAUI Property | Spice Implementation | Should Implement? | Notes |\n|--------------|---------------------|-------------------|-------|\n| BackgroundColor | ✅ Yes | ✅ Done | Color type |\n| Background | ❌ No | ❌ No | Brush (gradients) - complex |\n| Opacity | ✅ Yes | ✅ Done | 0-1 transparency - clamped range |\n| IsVisible | ✅ Yes | ✅ Done | Show/hide element - very common |\n| Shadow | ❌ No | ❌ No | Platform-inconsistent, use native |\n| Clip | ❌ No | ❌ No | Advanced, less common |\n\n### Transform Properties\n\n| MAUI Property | Spice Implementation | Should Implement? | Notes |\n|--------------|---------------------|-------------------|-------|\n| Rotation | ❌ No | ❌ No | Animation-focused, adds complexity |\n| RotationX | ❌ No | ❌ No | 3D transforms - rare use case |\n| RotationY | ❌ No | ❌ No | 3D transforms - rare use case |\n| Scale | ❌ No | ❌ No | Animation-focused |\n| ScaleX | ❌ No | ❌ No | Animation-focused |\n| ScaleY | ❌ No | ❌ No | Animation-focused |\n| TranslationX | ❌ No | ❌ No | Animation-focused |\n| TranslationY | ❌ No | ❌ No | Animation-focused |\n| AnchorX | ❌ No | ❌ No | Transform origin - depends on transforms |\n| AnchorY | ❌ No | ❌ No | Transform origin - depends on transforms |\n\n### Interaction Properties\n\n| MAUI Property | Spice Implementation | Should Implement? | Notes |\n|--------------|---------------------|-------------------|-------|\n| IsEnabled | ✅ Yes | ✅ Done | Enable/disable interaction - essential for forms |\n| InputTransparent | ❌ No | 🟡 Maybe | Pass-through touch events - useful |\n| IsFocused | ❌ No | ❌ No | Read-only focus state - advanced |\n| GestureRecognizers | ❌ No | ❌ No | Add tap handlers directly to controls |\n\n### Hierarchy & Navigation\n\n| MAUI Property | Spice Implementation | Should Implement? | Notes |\n|--------------|---------------------|-------------------|-------|\n| Children (collection) | ✅ Yes | ✅ Done | `ObservableCollection<View>` |\n| Parent | ❌ No | 🟡 Maybe | Parent element - useful for traversal |\n| Navigation | ❌ No | ❌ No | MAUI page-based navigation |\n| Id | ❌ No | ❌ No | Unique identifier - less useful |\n\n### Styling & Resources\n\n| MAUI Property | Spice Implementation | Should Implement? | Notes |\n|--------------|---------------------|-------------------|-------|\n| Style | ❌ No | ❌ No | XAML-focused pattern |\n| StyleClass | ❌ No | ❌ No | CSS-like classes - binding-focused |\n| Class | ❌ No | ❌ No | Style classes - binding-focused |\n| ClassId | ❌ No | ❌ No | Semantic identifier - testing-focused |\n| StyleId | ❌ No | ❌ No | User identifier - debugging-focused |\n| Resources | ❌ No | ❌ No | XAML resource dictionary |\n| Behaviors | ❌ No | ❌ No | XAML behavior system |\n| Triggers | ❌ No | ❌ No | XAML property triggers |\n| Effects | ❌ No | ❌ No | Platform effects - advanced |\n\n### Data Binding & Context\n\n| MAUI Property | Spice Implementation | Should Implement? | Notes |\n|--------------|---------------------|-------------------|-------|\n| BindingContext | ❌ No | ❌ No | Data binding context (not Spice's philosophy) |\n\n### Platform & Accessibility\n\n| MAUI Property | Spice Implementation | Should Implement? | Notes |\n|--------------|---------------------|-------------------|-------|\n| AutomationId | ✅ Yes | ✅ Done | UI testing identifier - useful for QA |\n| Handler | ❌ No | ❌ No | Platform handler - internal |\n| FlowDirection | ❌ No | 🟢 Maybe | RTL support - i18n feature |\n| IsLoaded | ❌ No | ❌ No | Loaded state - internal lifecycle |\n| Dispatcher | ❌ No | ❌ No | UI thread dispatcher - internal |\n\n### Spice-Specific Properties\n\n| Spice Property | MAUI Equivalent | Notes |\n|---------------|-----------------|-------|\n| Children | Yes (in Container types) | `ObservableCollection<View>`, supports collection initializers |\n| HorizontalOptions | HorizontalOptions | Uses `LayoutOptions` with alignment and expansion flags |\n| VerticalOptions | VerticalOptions | Uses `LayoutOptions` with alignment and expansion flags |\n| BackgroundColor | BackgroundColor | Uses `Microsoft.Maui.Graphics.Color` |\n| IsVisible | IsVisible | Show/hide element |\n| IsEnabled | IsEnabled | Enable/disable interaction |\n| Opacity | Opacity | 0-1 transparency, clamped range |\n| AutomationId | AutomationId | UI testing identifier |\n| Margin | Margin | Outer spacing using Thickness struct |\n| WidthRequest | WidthRequest | Desired width for sizing |\n| HeightRequest | HeightRequest | Desired height for sizing |\n| Width | Width | Read-only actual width |\n| Height | Height | Read-only actual height |\n\n### Summary\n\n**Spice View Properties: 14**\n- Children (collection)\n- HorizontalOptions (LayoutOptions)\n- VerticalOptions (LayoutOptions)\n- BackgroundColor\n- IsVisible\n- IsEnabled\n- Opacity\n- AutomationId\n- Margin\n- WidthRequest\n- HeightRequest\n- Width (read-only)\n- Height (read-only)\n\n**MAUI View/VisualElement Properties: 60+**\n\nSpice's `View` class is intentionally minimal, focusing on the essential properties needed for basic layout and appearance. MAUI's extensive property set supports:\n- Complex styling and theming (not in Spice)\n- Data binding and MVVM (not in Spice)\n- Advanced transforms and animations (not in Spice)\n- Accessibility and testing infrastructure (not in Spice)\n- Resource management and behaviors (not in Spice)\n\nSpice uses `[ObservableProperty]` for property change notifications, generating `On{Prop}Changed` partial methods implemented in platform-specific files, rather than MAUI's `BindableProperty` system.\n\n---\n\n## Recommended Additions for Spice\n\nBased on Spice's minimalist philosophy and common mobile UI needs, here are reasonable additions that would enhance functionality without compromising simplicity:\n\n### 🔥 High Priority - Essential Controls\n\n**Layouts**\n- ✅ **Grid** - Essential for complex layouts; maps to UIStackView/LinearLayout with weights or constraint-based layout (IMPLEMENTED)\n- ✅ **ScrollView** - Fundamental for scrollable content; maps to UIScrollView/ScrollView (IMPLEMENTED)\n\n**Input Controls**\n- ✅ **Switch** - Standard toggle control; maps to UISwitch/SwitchCompat (IMPLEMENTED)\n- ✅ **Slider** - Common for settings/media controls; maps to UISlider/SeekBar (IMPLEMENTED)\n- ✅ **Picker** - Standard dropdown/selection; maps to UIPickerView/Spinner (IMPLEMENTED)\n- ✅ **DatePicker** - Date selection; maps to UIDatePicker/DatePickerDialog (IMPLEMENTED)\n- ✅ **TimePicker** - Time selection; maps to UIDatePicker/TimePickerDialog (IMPLEMENTED)\n- ✅ **CheckBox** - Boolean selection; maps to UIButton (checkmark)/CheckBox (IMPLEMENTED)\n\n**Display Controls**\n- ✅ **ActivityIndicator** - Loading spinner; maps to UIActivityIndicatorView/ProgressBar (indeterminate) (IMPLEMENTED)\n- ✅ **ProgressBar** - Progress display; maps to UIProgressView/ProgressBar (determinate) (IMPLEMENTED)\n\n### 🟡 Medium Priority - Very Useful\n\n**Layouts**\n- ✅ **ContentView** - Custom control container for composition (IMPLEMENTED)\n- ✅ **Border** - Wraps content with border/rounded corners; common UI pattern (IMPLEMENTED)\n\n**Lists**\n- ✅ **CollectionView** - Flexible grid/list; maps to UICollectionView/RecyclerView (IMPLEMENTED)\n- 🟡 **ListView** - Scrollable list of items; maps to UITableView/RecyclerView (critical for many apps)\n\n**Input**\n- ✅ **Editor** - Multi-line text input; maps to UITextView/EditText (multiline) (IMPLEMENTED)\n- ✅ **SearchBar** - Search input; maps to UISearchBar/SearchView (IMPLEMENTED)\n\n**Display**\n- ✅ **ImageButton** - Tappable image; common pattern (can be done with Image + gesture) (IMPLEMENTED)\n\n### 🟢 Nice to Have - Special Cases\n\n**Advanced Controls**\n- ✅ **RefreshView** - Pull-to-refresh wrapper (IMPLEMENTED)\n- ✅ **SwipeView** - Swipe actions/context menus (IMPLEMENTED)\n- ✅ **RadioButton** - Radio button groups; uses cross-platform GroupName since iOS has no native radio concept\n\n**Shapes** (Lower priority - can use Image or GraphicsView)\n- ✅ **BoxView** - Colored rectangle (useful for dividers/spacers) (IMPLEMENTED)\n- 🟢 **Rectangle/Ellipse** - Basic shapes\n\n### 📊 View Properties - High Priority\n\n**Layout & Sizing**\n- ✅ **WidthRequest/HeightRequest** - Essential for sizing views (IMPLEMENTED)\n- ✅ **Margin** - Outer spacing (critical for layouts) (IMPLEMENTED)\n- 🟡 **Padding** - Inner spacing (for containers)\n\n**Appearance**\n- ✅ **IsVisible** - Show/hide elements (very common) (IMPLEMENTED)\n- ✅ **Opacity** - Transparency (common for fade effects) (IMPLEMENTED)\n\n**Interaction**\n- ✅ **IsEnabled** - Enable/disable controls (essential for forms) (IMPLEMENTED)\n\n### ❌ Not Recommended\n\n**Probably Skip**\n- ❌ **Transforms** (Rotation, Scale, Translation) - Animation-focused, adds complexity\n- ❌ **CarouselView** - Complex, less common\n- ❌ **IndicatorView** - Depends on CarouselView\n- ❌ **TabbedPage/NavigationPage** - Page-level navigation (different architecture)\n- ❌ **Map** - External dependency (Microsoft.Maui.Controls.Maps)\n- ❌ **GraphicsView** - Advanced graphics (Microsoft.Maui.Graphics already available)\n- ❌ **HybridWebView** - Specialized, newer control\n- ❌ **TitleBar** - Desktop-focused\n- ❌ **TwoPaneView** - Foldable-specific\n- ❌ **Shapes** (Path, Polygon, Polyline, Line) - Can use Image or custom drawing\n- ❌ **Shadow** - Platform-inconsistent, can use native code\n- ❌ **Clip** - Advanced, less common\n- ❌ **GestureRecognizers** - Can add tap handlers directly to controls\n- ❌ **Behaviors/Triggers/Effects** - XAML/binding-focused patterns\n- ❌ **Stepper** - Rare, can use buttons + label\n\n### Implementation Priority\n\n**Phase 1 (Core Controls)** ✅\n1. ✅ Grid layout\n2. ✅ ScrollView\n3. ✅ Switch\n4. ✅ ActivityIndicator\n5. ✅ ProgressBar\n6. ✅ IsVisible property\n7. ✅ IsEnabled property\n8. ✅ WidthRequest/HeightRequest\n9. ✅ Margin\n\n**Phase 2 (Input Controls)** ✅\n1. ✅ Picker\n2. ✅ Slider\n3. ✅ CheckBox\n4. ✅ DatePicker\n5. ✅ TimePicker\n6. ✅ Editor (multiline text)\n\n**Phase 3 (Lists & Advanced)** ✅\n1. 🟡 ListView\n2. ✅ SearchBar\n3. ✅ CollectionView\n4. ✅ Border\n5. ✅ ContentView\n6. ✅ ImageButton\n\n**Phase 4 (Nice-to-Have)** ✅\n1. ✅ RefreshView\n2. ✅ SwipeView\n3. ✅ BoxView\n4. ✅ RadioButton\n5. ✅ Opacity property\n\n---\n\n*Note: Spice is focused on minimal cross-platform UI with no Microsoft.Maui.Controls dependency. Controls are added based on common mobile scenarios rather than full MAUI parity.*\n"
  },
  {
    "path": "docs/NAVIGATION-SPEC.md",
    "content": "# Navigation in Spice 🌶\n\nThree new views and two methods on `Application`. That's it.\n\n## Overview\n\n| Type | What it does | iOS | Android |\n|------|-------------|-----|---------|\n| `NavigationView` | Push/pop stack with nav bar | `UINavigationController` | AndroidX Navigation |\n| `TabView` | Bottom tabs | `UITabBarController` | `BottomNavigationView` |\n| `Application.PresentAsync()` | Modal overlay | `PresentViewController()` | `DialogFragment` |\n\n> These are **views**, not pages — they compose with existing Spice views like any other layout.\n> `Application.Main` swapping still works; these are additive.\n\n## NavigationView\n\n```csharp\npublic class App : Application\n{\n    public App()\n    {\n        Main = new NavigationView<HomeView>();\n    }\n}\n\npublic class HomeView : StackLayout\n{\n    public HomeView()\n    {\n        Title = \"Home\";\n        Add(new Label { Text = \"Welcome!\" });\n        Add(new Button\n        {\n            Text = \"Details\",\n            Clicked = _ => Navigation!.Push<DetailView>()\n        });\n    }\n}\n\npublic class DetailView : StackLayout\n{\n    public DetailView()\n    {\n        Title = \"Details\";\n        Add(new Label { Text = \"Detail content\" });\n    }\n    // Back button is automatic — no code needed\n}\n```\n\n### Proposed API\n\n```csharp\n// Added to View base class\npublic partial class View\n{\n    [ObservableProperty] string _title = \"\";\n    public NavigationView? Navigation { get; internal set; }\n}\n\npublic partial class NavigationView : View\n{\n    public NavigationView(View root);\n    public NavigationView(Func<View> factory);             // lazy with args\n    public void Push(View view);\n    public void Push(Func<View> factory);                  // lazy with args\n    public void Push<T>() where T : View, new();           // lazy parameterless\n    public void Pop();\n    public void PopToRoot();\n}\n\n// Generic subclass — creates root view lazily\npublic partial class NavigationView<TRoot> : NavigationView where TRoot : View, new()\n{\n    public NavigationView();\n}\n```\n\n`Push`/`Pop` are synchronous — matches Spice's `Action<T>` callback pattern. The native platform handles animations.\n\n`Push<T>()` and `Push(() => new T(args))` create the view on demand. Use `Push(view)` when you already have one.\n\n`Title` is added to `View` so any view can set a nav bar title. Ignored when not inside a `NavigationView`.\n\n`Navigation` is set on child views by `NavigationView` when they're pushed, similar to how layouts already manage their `Children`.\n\n## TabView\n\n```csharp\nMain = new TabView\n{\n    new Tab<HomeView>(\"Home\", \"home.png\"),\n    new Tab<SearchView>(\"Search\", \"search.png\"),\n    new Tab<ProfileView>(\"Profile\", \"profile.png\"),\n};\n```\n\nEach tab can contain a `NavigationView` for independent push/pop stacks:\n\n```csharp\nMain = new TabView\n{\n    new Tab(\"Home\", \"home.png\", new NavigationView<HomeView>()),\n    new Tab(\"Search\", \"search.png\", new NavigationView<SearchView>()),\n};\n```\n\n### Proposed API\n\n```csharp\npublic partial class TabView : View\n{\n    public void Add(Tab tab);  // collection initializer support\n}\n\npublic partial class Tab : View\n{\n    [ObservableProperty] string _icon = \"\";\n\n    public Tab(string title, string icon, View content);\n    public Tab(string title, string icon, Func<View> factory);  // lazy with args\n}\n\n// Generic subclass — creates content lazily on first tab selection\npublic partial class Tab<TContent> : Tab where TContent : View, new()\n{\n    public Tab(string title, string icon);\n}\n```\n\n`Tab` reuses `View.Title` for the tab label and `View.Children` for its content.\n\n## Modal Presentation\n\n```csharp\n// Present (from any view)\nawait PresentAsync<LoginView>();\n\n// Dismiss (from inside the modal)\nawait DismissAsync();\n```\n\n### Proposed API\n\n```csharp\npublic partial class View\n{\n    public Task PresentAsync(View view);\n    public Task PresentAsync(Func<View> factory);              // lazy with args\n    public Task PresentAsync<T>() where T : View, new();      // lazy parameterless\n    public Task DismissAsync();\n}\n```\n\nModal methods live on `View` so any view can present/dismiss — no need for a global `Application.Current` singleton.\n\nModals are async because the caller often needs to know when presentation/dismissal completes (e.g., to read a result). `Push`/`Pop` don't need this — you fire and forget.\n\n## Complete Example\n\n```csharp\npublic class App : Application\n{\n    public App()\n    {\n        Main = new TabView\n        {\n            new Tab(\"Feed\", \"feed.png\", new NavigationView<FeedView>()),\n            new Tab<ProfileView>(\"Profile\", \"profile.png\"),\n        };\n    }\n}\n\npublic class FeedView : StackLayout\n{\n    public FeedView()\n    {\n        Title = \"Feed\";\n        Add(new Button\n        {\n            Text = \"View Post\",\n            Clicked = _ => Navigation!.Push<PostView>()\n        });\n        Add(new Button\n        {\n            Text = \"New Post\",\n            Clicked = async _ => await PresentAsync<NewPostView>()\n        });\n    }\n}\n\npublic class PostView : StackLayout\n{\n    public PostView()\n    {\n        Title = \"Post\";\n        Add(new Label { Text = \"Post content...\" });\n        Add(new Button\n        {\n            Text = \"Comments\",\n            Clicked = _ => Navigation!.Push<CommentsView>()\n        });\n    }\n}\n\npublic class NewPostView : StackLayout\n{\n    public NewPostView()\n    {\n        Title = \"New Post\";\n        Add(new Entry { Placeholder = \"What's on your mind?\" });\n        Add(new Button\n        {\n            Text = \"Post\",\n            Clicked = async _ => await DismissAsync()\n        });\n    }\n}\n```\n\n## Migration\n\n```csharp\n// Before — swap the whole view tree\nnew Button { Clicked = _ => Main = new DetailView() }\n\n// After — push onto the stack, get a nav bar + back button for free\nnew Button { Clicked = _ => Navigation!.Push<DetailView>() }\n```\n\n## Platform Mapping\n\n### iOS\n\n| Spice | iOS |\n|-------|-----|\n| `NavigationView` | `UINavigationController` |\n| `Push()` | `pushViewController(_:animated:)` |\n| `Pop()` | `popViewController(animated:)` |\n| `PopToRoot()` | `popToRootViewController(animated:)` |\n| `TabView` | `UITabBarController` |\n| `Tab` | `UITab` / tab bar item |\n| `PresentAsync()` | `present(_:animated:completion:)` |\n| `DismissAsync()` | `dismiss(animated:completion:)` |\n\n### Android\n\n| Spice | Android |\n|-------|---------|\n| `NavigationView` | `NavController` + `NavHostFragment` |\n| `Push()` | `navigate()` |\n| `Pop()` | `navigateUp()` |\n| `PopToRoot()` | `popBackStack(startDest)` |\n| `TabView` | `BottomNavigationView` |\n| `Tab` | Menu item |\n| `PresentAsync()` | `DialogFragment.show()` |\n| `DismissAsync()` | `DialogFragment.dismiss()` |\n\n## Design Decisions\n\n**Why \"views\" not \"pages\"?** Spice doesn't have pages. `NavigationView` and `TabView` are views — they inherit from `View`, use `[ObservableProperty]`, and compose like `StackLayout` or `Grid`.\n\n**Why sync Push/Pop but async modals?** Push/pop match Spice's `Action<T>` event pattern — no `async void` needed in `Clicked` handlers. Modals are async because callers often await the result.\n\n**Why `Title` on View?** It's one `[ObservableProperty]` field. Ignored unless the view is inside a `NavigationView` or `Tab`. Simpler than a separate \"page\" abstraction.\n\n**What about `Application.Main` swapping?** Still works. Use `NavigationView`/`TabView` when you want native navigation chrome (back button, nav bar, tab bar). Use `Main =` when you don't.\n\n**Why three overload forms?** `Push(view)` for pre-built views. `Push<T>()` for parameterless construction. `Push(() => new DetailView(postId))` for lazy creation with arguments. Same pattern on `Tab`, `NavigationView`, and `PresentAsync`.\n"
  },
  {
    "path": "docs/THEME-SPEC.md",
    "content": "# Themes in Spice 🌶\n\n**Status:** Implemented  \n**Created:** February 2026\n\n## Overview\n\nSpice provides a built-in `Theme` class — a plain C# object with well-known color\nproperties — and a mechanism for views to consume those colors automatically, update\nlive when the theme changes, and still allow per-view overrides. The entire design is\n**NativeAOT safe, trimmer safe, and reflection-free**.\n\n## `Theme` Class\n\n### Core API\n\nA `Theme` is just a POCO that extends `ObservableObject` — same base as every Spice view.\nIt defines **semantic color slots** that map to view properties:\n\n```csharp\npublic partial class Theme : ObservableObject\n{\n    /// <summary>Default text color for Label, Button, Entry, SearchBar, etc.</summary>\n    [ObservableProperty]\n    Color? _textColor;\n\n    /// <summary>Default background color for all views.</summary>\n    [ObservableProperty]\n    Color? _backgroundColor;\n\n    /// <summary>Accent/tint color for interactive controls (Button background, Switch tint, ActivityIndicator, etc.)</summary>\n    [ObservableProperty]\n    Color? _accentColor;\n\n    /// <summary>Border/stroke color for Border views.</summary>\n    [ObservableProperty]\n    Color? _strokeColor;\n\n    /// <summary>Placeholder text color for Editor, SearchBar, etc.</summary>\n    [ObservableProperty]\n    Color? _placeholderColor;\n}\n```\n\nNo reflection, no dictionaries, no string lookups. Just typed properties on a typed object.\n\n### Built-In Light and Dark Themes\n\nThe built-in themes use float constructors instead of `Colors` static properties to avoid\npulling `Microsoft.Maui.Graphics` references into the AOT-compiled output, keeping APK size\ndown:\n\n```csharp\npublic partial class Theme\n{\n    public static Theme Light => new()\n    {\n        TextColor = Black,                                   // #000000\n        BackgroundColor = White,                             // #FFFFFF\n        AccentColor = new Color(0f, 0.471f, 0.831f),        // #0078D4\n        StrokeColor = new Color(0.878f, 0.878f, 0.878f),    // #E0E0E0\n        PlaceholderColor = DarkGray,                         // #A9A9A9\n    };\n\n    public static Theme Dark => new()\n    {\n        TextColor = White,                                    // #FFFFFF\n        BackgroundColor = new Color(0.118f, 0.118f, 0.118f),  // #1E1E1E\n        AccentColor = new Color(0.298f, 0.761f, 1f),          // #4CC2FF\n        StrokeColor = new Color(0.251f, 0.251f, 0.251f),      // #404040\n        PlaceholderColor = LightGray,                          // #D3D3D3\n    };\n}\n```\n\n### Setting the Theme on Application\n\n```csharp\npublic partial class Application : View\n{\n    /// <summary>\n    /// The current theme. Setting this applies colors to the entire view tree\n    /// and subscribes to live updates. Null means no theme — views keep their\n    /// individually-set colors (backward compatible default).\n    /// </summary>\n    [ObservableProperty]\n    Theme? _theme;\n}\n```\n\n> **Why nullable?** Theming is opt-in. Existing apps that never set `Theme` continue\n> working exactly as before — no colors change, no behavior changes. Apps opt in with\n> a single line: `Theme = Theme.Light;`\n\n## How Theming Works\n\n### Step 1: Each View Knows How to Apply a Theme\n\nEvery view type overrides a `protected virtual` method that maps theme color slots to its\nown properties. This is the **only** connection between themes and views — no reflection,\nno attribute scanning, no magic.\n\nThe base `View` class applies `BackgroundColor`:\n\n```csharp\n// In View (base class)\nprotected virtual void ApplyTheme(Theme theme)\n{\n    if (CanApplyTheme((int)ThemeProperty.BackgroundColor))\n        BackgroundColor = theme.BackgroundColor;\n}\n```\n\nSubclasses override to add their own mappings:\n\n```csharp\n// In Label\nprotected override void ApplyTheme(Theme theme)\n{\n    base.ApplyTheme(theme);\n    if (CanApplyTheme((int)ThemeProperty.TextColor))\n        TextColor = theme.TextColor;\n}\n```\n\n```csharp\n// In Button — uses AccentColor for its background\nprotected override void ApplyTheme(Theme theme)\n{\n    base.ApplyTheme(theme);\n    if (CanApplyTheme((int)ThemeProperty.TextColor))\n        TextColor = theme.TextColor;\n    if (CanApplyTheme((int)ThemeProperty.BackgroundColor))\n        BackgroundColor = theme.AccentColor;\n}\n```\n\n```csharp\n// In Border\nprotected override void ApplyTheme(Theme theme)\n{\n    base.ApplyTheme(theme);\n    if (CanApplyTheme((int)ThemeProperty.Stroke))\n        Stroke = theme.StrokeColor;\n}\n```\n\n```csharp\n// In Editor — text and placeholder colors\nprotected override void ApplyTheme(Theme theme)\n{\n    base.ApplyTheme(theme);\n    if (CanApplyTheme((int)ThemeProperty.TextColor))\n        TextColor = theme.TextColor;\n    if (CanApplyTheme((int)ThemeProperty.PlaceholderColor))\n        PlaceholderColor = theme.PlaceholderColor;\n}\n```\n\n```csharp\n// In ActivityIndicator — accent color\nprotected override void ApplyTheme(Theme theme)\n{\n    base.ApplyTheme(theme);\n    if (CanApplyTheme((int)ThemeProperty.Color))\n        Color = theme.AccentColor;\n}\n```\n\n#### Complete Theme Mapping Table\n\n| View | Theme Slot → Property |\n|---|---|\n| **View** (base) | `BackgroundColor` → `BackgroundColor` |\n| **Label** | `TextColor` → `TextColor` |\n| **Button** | `TextColor` → `TextColor`, `AccentColor` → `BackgroundColor` |\n| **Entry** | `TextColor` → `TextColor` |\n| **Editor** | `TextColor` → `TextColor`, `PlaceholderColor` → `PlaceholderColor` |\n| **SearchBar** | `TextColor` → `TextColor`, `PlaceholderColor` → `PlaceholderColor` |\n| **DatePicker** | `TextColor` → `TextColor` |\n| **Picker** | `TextColor` → `TextColor` |\n| **Border** | `StrokeColor` → `Stroke` |\n| **ActivityIndicator** | `AccentColor` → `Color` |\n\nViews that only inherit the base `BackgroundColor` mapping (no override): Image, ImageButton,\nSwitch, Slider, ProgressBar, WebView, ScrollView, StackLayout, ContentView, Grid, BoxView,\nCheckBox, RadioButton, TimePicker.\n\n### Step 2: Tracking \"Developer Set\" vs \"Theme Set\"\n\nWhen a developer explicitly sets a color on a view, that value takes priority over the\ntheme. This is tracked with a bitmask (`_explicitProps`) and a `ThemeProperty` flags enum:\n\n```csharp\npublic partial class View\n{\n    /// <summary>\n    /// Built-in theme property flags. An Int32 supports up to 32 properties.\n    /// Custom views can define additional flags starting at 1 << 5.\n    /// </summary>\n    [Flags]\n    public enum ThemeProperty\n    {\n        None            = 0,\n        BackgroundColor = 1 << 0,\n        TextColor       = 1 << 1,\n        PlaceholderColor= 1 << 2,\n        Stroke          = 1 << 3,\n        Color           = 1 << 4,\n    }\n\n    bool _isApplyingTheme;\n    int _explicitProps;\n\n    /// <summary>\n    /// Tracks whether a theme property was explicitly set by the developer.\n    /// When value is non-null the flag is set; when null it is cleared.\n    /// </summary>\n    public void TrackExplicit(int property, object? value)\n    {\n        if (!_isApplyingTheme)\n        {\n            if (value is not null)\n                _explicitProps |= property;\n            else\n                _explicitProps &= ~property;\n        }\n    }\n\n    /// <summary>\n    /// Returns true when the theme property has not been explicitly set.\n    /// </summary>\n    public bool CanApplyTheme(int property) => (_explicitProps & property) == 0;\n}\n```\n\nEach view hooks its `On{Prop}Changing` partial to call `TrackExplicit`:\n\n```csharp\n// In View\npartial void OnBackgroundColorChanging(Color? value) =>\n    TrackExplicit((int)ThemeProperty.BackgroundColor, value);\n\n// In Label\npartial void OnTextColorChanging(Color? value) =>\n    TrackExplicit((int)ThemeProperty.TextColor, value);\n\n// In Border\npartial void OnStrokeChanging(Color? value) =>\n    TrackExplicit((int)ThemeProperty.Stroke, value);\n```\n\n> **Why a bitmask instead of per-property booleans?** A single `int` tracks up to 32\n> properties with no per-field memory overhead. The `ThemeProperty` enum provides\n> compile-time safety for the flag values.\n\nTo **clear** an explicit override and revert to the theme:\n\n```csharp\nlabel.TextColor = null; // clears the flag, theme value applies on next theme application\n```\n\n### Step 3: Walking the View Tree\n\nWhen `Application.Theme` is set or changed, the entire `Main` view tree is walked via\n`ApplyThemeToTree` (an `internal static` method on `View`). Each view is themed through\n`ApplyThemeInternal`, which manages the `_isApplyingTheme` flag, stores the applied theme\nfor dynamic children, and delegates to the virtual `ApplyTheme`:\n\n```csharp\n// In View\ninternal void ApplyThemeInternal(Theme theme)\n{\n    _isApplyingTheme = true;\n    _appliedTheme = theme;\n\n    if (!_themeChildrenSubscribed)\n    {\n        _themeChildrenSubscribed = true;\n        Children.CollectionChanged += OnThemeChildrenChanged;\n    }\n\n    ApplyTheme(theme);\n    _isApplyingTheme = false;\n}\n\ninternal static void ApplyThemeToTree(View? view, Theme theme)\n{\n    if (view is null) return;\n    view.ApplyThemeInternal(theme);\n    foreach (var child in view.Children)\n        ApplyThemeToTree(child, theme);\n}\n```\n\nIn `Application`, theme changes subscribe to `PropertyChanged` for live updates. Setting\n`Main` after a theme also applies the theme to the new tree. Explicitly setting `Theme`\ndisables `UseSystemTheme`:\n\n```csharp\n// In Application\npartial void OnThemeChanging(Theme? value)\n{\n    if (!_isSettingSystemTheme)\n        UseSystemTheme = false;\n}\n\npartial void OnThemeChanged(Theme? oldValue, Theme? newValue)\n{\n    if (oldValue is not null)\n        oldValue.PropertyChanged -= OnThemePropertyChanged;\n\n    if (newValue is not null)\n    {\n        newValue.PropertyChanged += OnThemePropertyChanged;\n        ApplyThemeToTree(Main, newValue);\n    }\n}\n\npartial void OnMainChanged(View? oldValue, View? newValue)\n{\n    if (newValue is not null && Theme is not null)\n        ApplyThemeToTree(newValue, Theme);\n}\n\nvoid OnThemePropertyChanged(object? sender, PropertyChangedEventArgs e)\n{\n    if (Theme is not null)\n        ApplyThemeToTree(Main, Theme);\n}\n```\n\n### Step 4: New Views Get the Theme Too\n\nWhen a view is added to the tree at runtime, it picks up the current theme. Each\nview lazily subscribes to its own `Children.CollectionChanged` the first time\n`ApplyThemeInternal` is called, and themes any newly added children:\n\n```csharp\n// In View — registered lazily inside ApplyThemeInternal\nvoid OnThemeChildrenChanged(object? sender, NotifyCollectionChangedEventArgs e)\n{\n    if (e.NewItems is not null && _appliedTheme is not null)\n    {\n        foreach (View child in e.NewItems)\n            ApplyThemeToTree(child, _appliedTheme);\n    }\n}\n```\n\n## Dark Mode / Light Mode\n\n### Simple Toggle\n\n```csharp\npublic class App : Application\n{\n    public App()\n    {\n        Theme = Theme.Light;\n\n        var toggle = new Switch\n        {\n            Toggled = sw => Theme = sw.IsOn ? Theme.Dark : Theme.Light\n        };\n\n        Main = new StackLayout\n        {\n            new Label { Text = \"Hello, Spice 🌶\" },\n            new Label { Text = \"Dark Mode:\" },\n            toggle,\n        };\n    }\n}\n```\n\nFlipping the `Switch` swaps the entire theme — every view in the tree updates immediately.\n\n### Automatic System Appearance Detection\n\nSpice provides `PlatformAppearance` — a cross-platform static class that exposes the\nsystem's current appearance and a change notification:\n\n```csharp\npublic static partial class PlatformAppearance\n{\n    /// <summary>\n    /// Event raised when the system appearance changes.\n    /// The bool parameter is true when the system switched to dark mode.\n    /// </summary>\n    public static event Action<bool>? Changed;\n\n    /// <summary>\n    /// Gets whether the system is in dark mode.\n    /// </summary>\n    public static bool IsDarkMode { get; }\n}\n```\n\nSet `Application.UseSystemTheme = true` and Spice handles the rest:\n\n```csharp\npublic class App : Application\n{\n    public App()\n    {\n        UseSystemTheme = true; // auto-selects Theme.Light or Theme.Dark based on OS\n\n        Main = new StackLayout\n        {\n            new Label { Text = \"Hello, Spice 🌶\" },\n        };\n    }\n}\n```\n\nWhen `UseSystemTheme` is enabled:\n- On startup, Spice queries `PlatformAppearance.IsDarkMode` and sets `Theme` accordingly\n- It subscribes to `PlatformAppearance.Changed` so that `Theme` is swapped automatically when the OS appearance changes\n- Setting `Theme` explicitly disables `UseSystemTheme` (explicit wins)\n- When `UseSystemTheme` is disabled, the `Changed` subscription is removed\n\n```csharp\npartial void OnUseSystemThemeChanged(bool value)\n{\n    if (value)\n    {\n        PlatformAppearance.Changed += OnPlatformAppearanceChanged;\n        _isSettingSystemTheme = true;\n        Theme = PlatformAppearance.IsDarkMode ? Theme.Dark : Theme.Light;\n        _isSettingSystemTheme = false;\n    }\n    else\n    {\n        PlatformAppearance.Changed -= OnPlatformAppearanceChanged;\n    }\n}\n\nvoid OnPlatformAppearanceChanged(bool isDarkMode)\n{\n    if (_useSystemTheme)\n    {\n        _isSettingSystemTheme = true;\n        Theme = isDarkMode ? Theme.Dark : Theme.Light;\n        _isSettingSystemTheme = false;\n    }\n    AppearanceChanged?.Invoke(isDarkMode);\n}\n```\n\nPlatform implementations behind `PlatformAppearance.IsDarkMode`:\n\n- **iOS** — reads `UITraitCollection.CurrentTraitCollection.UserInterfaceStyle`; listens for trait changes via `RegisterForTraitChanges` (iOS 17+) or `TraitCollectionDidChange`.\n- **Android** — reads `UiMode.NightMask` from `Resources.Configuration`; listens for configuration changes in `SpiceActivity.OnConfigurationChanged`.\n\nFor fully custom themes that still track the OS mode, use the `AppearanceChanged` callback:\n\n```csharp\nAppearanceChanged = isDark => Theme = isDark ? myDarkTheme : myLightTheme;\n```\n\n## Custom Themes\n\n### Extend the Built-In Slots\n\nDevelopers can create their own themes by simply constructing `Theme` with different colors:\n\n```csharp\nvar corporate = new Theme\n{\n    TextColor = Color.FromArgb(\"#333333\"),\n    BackgroundColor = Color.FromArgb(\"#F5F5F5\"),\n    AccentColor = Color.FromArgb(\"#FF6600\"),    // brand orange\n    StrokeColor = Color.FromArgb(\"#CCCCCC\"),\n    PlaceholderColor = Color.FromArgb(\"#999999\"),\n};\napp.Theme = corporate;\n```\n\n### Add New Color Slots (Subclass)\n\nFor app-specific color slots that built-in views don't know about:\n\n```csharp\npublic partial class BrandTheme : Theme\n{\n    [ObservableProperty]\n    Color? _headerColor;\n\n    [ObservableProperty]\n    Color? _cardBackgroundColor;\n}\n```\n\nCustom views consume these in their own `ApplyTheme`:\n\n```csharp\npublic partial class HeaderView : Label\n{\n    protected override void ApplyTheme(Theme theme)\n    {\n        base.ApplyTheme(theme);\n        if (theme is BrandTheme brand && brand.HeaderColor is not null)\n            TextColor = brand.HeaderColor;\n    }\n}\n```\n\n## Per-View Overrides\n\nSetting a color explicitly on a view always wins over the theme:\n\n```csharp\napp.Theme = Theme.Dark; // TextColor = White\n\nvar label = new Label { Text = \"Always red\", TextColor = Colors.Red };\n// TextColor stays Red even though the theme says White\n```\n\nTo reset a view back to the theme's color:\n\n```csharp\nlabel.TextColor = null; // Reverts to theme's TextColor on next theme application\n```\n\n## Design Decisions\n\n### Why Not a Dictionary / Resource System?\n\nFrameworks like WPF and MAUI use dictionaries (`ResourceDictionary`) where theme values are\nlooked up by string key at runtime. This is flexible but:\n\n| | Dictionary (WPF/MAUI) | Typed Theme (Spice) |\n|---|---|---|\n| **NativeAOT safe** | ❌ Often uses reflection for type conversion | ✅ Plain properties, zero reflection |\n| **Trimmer safe** | ⚠️ String keys can't be statically analyzed | ✅ Direct property access, fully trimmable |\n| **Compile-time safety** | ❌ Typo in key = runtime error | ✅ Typo in property name = compile error |\n| **Discoverability** | ❌ Keys are strings, need documentation | ✅ IntelliSense shows all available slots |\n| **Debuggability** | ❌ Opaque dictionary lookups | ✅ Step through `ApplyTheme` line by line |\n\nA typed `Theme` class trades some flexibility (you can't add arbitrary keys at runtime) for\ncompile-time safety, IntelliSense, and zero runtime overhead. This matches Spice's philosophy.\n\n### Why Not Expression Trees / Compiled Lambdas?\n\nExpression trees would let us infer property names automatically, but they require\n`System.Linq.Expressions` which is not fully NativeAOT safe and increases binary size.\nExplicit virtual methods are zero-overhead and always trimmable.\n\n### Why a Bitmask for Override Tracking?\n\nA single `int _explicitProps` field tracks up to 32 themeable properties with zero\nper-field memory overhead. The `ThemeProperty` flags enum provides compile-time safety\nfor the bit positions. Custom views can define additional flags starting at `1 << 5`.\n\n### Why `protected virtual` Instead of `public virtual`?\n\n`ApplyTheme` is a framework implementation detail — developers don't call it directly,\nthey set `Application.Theme` and the framework handles the rest. Making it `protected`\nkeeps it out of the public API surface while still allowing external libraries and custom\ncontrols to override it and participate in theming.\n\n### Why Re-Apply the Entire Theme on Single-Property Changes?\n\nWhen `Theme.TextColor` changes, we re-apply the full theme to the view tree instead of\nonly updating text colors. This keeps the logic simple — `ApplyTheme` is the single source\nof truth for all theme→view mappings. Theme objects are small (a handful of color\nproperties), and the view tree traversal is fast (layout trees are typically shallow).\n\n## Full Example\n\n```csharp\npublic class App : Application\n{\n    public App()\n    {\n        Theme = Theme.Light;\n\n        int count = 0;\n        var label = new Label { Text = \"Hello, Spice 🌶\" };\n        var counter = new Label { Text = \"Times: 0\" };\n        var button = new Button\n        {\n            Text = \"Tap me\",\n            Clicked = _ => counter.Text = $\"Times: {++count}\",\n        };\n        var darkModeSwitch = new Switch\n        {\n            Toggled = sw => Theme = sw.IsOn ? Theme.Dark : Theme.Light,\n        };\n        var overrideLabel = new Label\n        {\n            Text = \"I'm always red\",\n            TextColor = Colors.Red, // explicit override — theme won't touch this\n        };\n\n        Main = new StackLayout\n        {\n            label,\n            counter,\n            button,\n            new StackLayout\n            {\n                Orientation = Orientation.Horizontal,\n                new Label { Text = \"Dark Mode:\" },\n                darkModeSwitch,\n            },\n            overrideLabel,\n        };\n    }\n}\n```\n\nToggle the switch → every view updates to dark colors instantly, except the red label which\nkeeps its explicit color.\n\n## Summary\n\n- **`Theme`** is a POCO extending `ObservableObject` — just typed color properties, no reflection\n- **`Application.Theme`** sets the active theme and walks the view tree\n- **Live updates** — change a theme property or swap the entire theme, views update immediately\n- **Explicit overrides win** — set `TextColor = Colors.Red` and the theme won't touch it; set to `null` to revert\n- **Bitmask tracking** — `ThemeProperty` flags + `_explicitProps` track developer-set vs theme-set properties\n- **Dynamic children** — views added to the tree at runtime automatically receive the current theme\n- **Dark/Light mode** — `UseSystemTheme = true` auto-detects OS appearance; or swap manually with one assignment\n- **Custom themes** — subclass `Theme` or just construct one with your own colors\n- **NativeAOT safe** — zero reflection, fully trimmable, compile-time type safety\n"
  },
  {
    "path": "docs/VIEW-LIFECYCLE-SPEC.md",
    "content": "# View Lifecycle & Cleanup in Spice 🌶\n\n**Status:** Design Specification  \n**Created:** February 2026\n\n## Overview\n\nSpice Views are created lazily and kept alive by their parent hierarchy. To support proper\ncleanup (e.g., disposing event subscriptions from `Bind()`), we propose a simple contract:\n**if a View implements `IDisposable`, its `Dispose()` will be called when the view is no longer needed.**\n\nThis spec defines when and how disposal happens on each platform.\n\n## Current State\n\n- **Android:** Views are C# partial classes wrapping `Android.Views.ViewGroup`\n- **iOS:** Views are C# partial classes wrapping `UIView`\n- **Lifecycle:** Managed implicitly by platform (Activity destruction on Android, ARC on iOS)\n- **Disposal:** Currently no explicit cleanup contract — memory leaks possible if custom Views hold subscriptions\n\n## Proposed: IDisposable Contract\n\n**Key principle:** Only custom Views that hold resources implement `IDisposable` (opt-in).\nBuilt-in Views (Button, Label, StackLayout, etc.) do **not** implement `IDisposable`.\n\n### What Gets Disposed\n\n1. **Custom Views that implement `IDisposable`** — `Dispose()` is called when the view is destroyed\n2. **Children of a disposed view** — if a parent is disposed, it recursively disposes children that are `IDisposable`\n3. **Resources:** Event subscriptions, timers, and `Bind()` subscriptions can be freed this way\n\n### Platform Semantics\n\n#### Android\n\nWhen the `Application`'s `Activity` is destroyed (user backs out, etc.):\n1. Each View's `NativeView` (underlying `ViewGroup`) is removed from the hierarchy\n2. **Top-level app View** — call `Dispose()` if it implements `IDisposable`\n3. **Recursively dispose children** — foreach child in `Children`, call `Dispose()` if it's `IDisposable`\n4. **Bottom-up** — children disposed before parents\n\n```csharp\n// Pseudo-code in MainActivity.OnDestroy or Activity.OnDestroy equivalent\nprotected override void OnDestroy()\n{\n    if (_appView is IDisposable disposable)\n        disposable.Dispose();\n    base.OnDestroy();\n}\n```\n\n#### iOS\n\nWhen a View is removed from the hierarchy (e.g., navigation pop, cell recycle):\n1. View is **no longer strongly referenced** by its parent's `Children` collection\n2. **ARC (Automatic Reference Counting) deinit** is called on the Spice View wrapper\n3. In the Spice View's `deinit` (C# finalizer or explicit cleanup), call `Dispose()` if it's `IDisposable`\n4. **Recursively dispose children** — same as Android\n\nSince Spice Views are managed objects in a `Children` collection, we can wrap the collection\nremoval to trigger cleanup:\n\n```csharp\n// In iOS View.cs\nvoid OnChildrenChanged(object? sender, NotifyCollectionChangedEventArgs e)\n{\n    if (e.Action == NotifyCollectionChangedAction.Remove)\n    {\n        foreach (var item in e.OldItems ?? [])\n        {\n            if (item is View view && view is IDisposable disposable)\n                disposable.Dispose();\n        }\n    }\n    // ... also handle Replace, etc.\n}\n```\n\n#### CollectionView Recycling\n\n**Special case:** CollectionView recycles ItemTemplate views. When a template view is recycled:\n1. The item stays alive (kept in `ItemsSource`)\n2. The **view wrapper** is removed from the hierarchy\n3. Any `Bind()` subscriptions on the item should be disposed **OR** left alive if the item is reused\n\n**Recommendation:** For CollectionView, don't dispose item ViewModels (they're recycled).\nInstead, use weak references or check `IsVisible` before updating:\n\n```csharp\n// Don't dispose the TodoItem itself — it will be recycled\n// The Bind() subscription will be garbage collected when the view is recycled\n```\n\n## Implementing IDisposable in Spice Views\n\n### Pattern 1: Single IDisposable Resource\n\n```csharp\npublic partial class TimerView : StackLayout, IDisposable\n{\n    private System.Timers.Timer? _timer;\n    private IDisposable? _binding;\n\n    public TimerView()\n    {\n        var vm = new TimerViewModel();\n        var label = new Label();\n\n        // This subscription needs cleanup\n        _binding = vm.Bind(nameof(vm.Elapsed), v => v.Elapsed, \n            elapsed => label.Text = $\"{elapsed}s\");\n\n        // And a timer that needs stopping\n        _timer = new System.Timers.Timer(1000);\n        _timer.Elapsed += (_, _) => vm.Tick();\n\n        Children.Add(label);\n    }\n\n    public void Dispose()\n    {\n        _binding?.Dispose();\n        _timer?.Dispose();\n    }\n}\n```\n\n### Pattern 2: CompositeDisposable\n\n```csharp\npublic partial class FormView : StackLayout, IDisposable\n{\n    private readonly List<IDisposable> _subscriptions = new();\n\n    public FormView()\n    {\n        var vm = new FormViewModel();\n        // ... create UI ...\n\n        _subscriptions.Add(vm.Bind(nameof(vm.IsValid), ...));\n        _subscriptions.Add(vm.Bind(nameof(vm.ErrorMessage), ...));\n    }\n\n    public void Dispose()\n    {\n        foreach (var sub in _subscriptions)\n            sub?.Dispose();\n        _subscriptions.Clear();\n    }\n}\n```\n\n## When to Dispose\n\n### ✅ DO dispose:\n- Custom `Bind()` subscriptions when the binding outlives the view\n- Event subscriptions (timers, HTTP clients, etc.)\n- File handles, database connections\n- WeakReference holders that prevent collection\n\n### ❌ DON'T dispose:\n- Items in `ItemsSource` (they're reused across recycled views)\n- Shared singletons (Application state, Services)\n- Views that are still in the hierarchy (parent disposes them)\n\n## Default Behavior (No Explicit Dispose)\n\nIf a View does **not** implement `IDisposable`, nothing special happens—the view is garbage\ncollected when no longer referenced, and any subscriptions are dropped naturally.\n\nThis is fine for simple Views. Only implement `IDisposable` if your View holds resources\nthat need explicit cleanup.\n\n## Implementation Roadmap\n\n### Phase 1: Documentation (this spec) ✓\n- Establish the contract: custom Views can implement `IDisposable`\n- Show patterns and examples\n- Guide developers on when to implement `IDisposable`\n\n### Phase 2: Platform Integration (future)\n**Android:** Call `Dispose()` on the app's top-level View during `Activity.OnDestroy()`\n\n```csharp\nprotected override void OnDestroy()\n{\n    if (_appView is IDisposable disposable)\n        disposable.Dispose();\n    base.OnDestroy();\n}\n```\n\n**iOS:** Hook `Children.CollectionChanged` to dispose removed views\n\n```csharp\n// In View.cs\nprivate void OnChildrenChanged(object? sender, NotifyCollectionChangedEventArgs e)\n{\n    if (e.Action == NotifyCollectionChangedAction.Remove)\n    {\n        foreach (var item in e.OldItems ?? [])\n        {\n            if (item is IDisposable disposable)\n                disposable.Dispose();\n        }\n    }\n    // ... also handle Replace, etc.\n}\n```\n\n## Example: Todo App with Cleanup\n\n```csharp\npublic partial class TodoItemView : StackLayout, IDisposable\n{\n    private IDisposable? _binding;\n\n    public TodoItemView(TodoItem item)\n    {\n        var label = new Label();\n        var checkbox = new CheckBox();\n\n        // This subscription must be cleaned up when the view is recycled\n        _binding = item.Bind(nameof(item.Title), t => t.Title, \n            text => label.Text = text);\n\n        item.Bind(nameof(item.IsCompleted), t => t.IsCompleted,\n            done => checkbox.IsChecked = done);\n\n        checkbox.CheckedChanged = cb => item.IsCompleted = cb.IsChecked;\n\n        Children.Add(new StackLayout { label, checkbox });\n    }\n\n    public void Dispose()\n    {\n        _binding?.Dispose();\n        // Bindings to checkbox are implicitly cleaned up with the view\n    }\n}\n\npublic class TodoListApp : Application\n{\n    public TodoListApp()\n    {\n        var vm = new TodoListViewModel();\n\n        var collectionView = new CollectionView\n        {\n            ItemsSource = vm.Items,\n            ItemTemplate = item => new TodoItemView((TodoItem)item)\n        };\n\n        Main = new StackLayout { collectionView };\n    }\n}\n```\n\n## Notes\n\n- **No finalizers:** Avoid finalizers in Views — they create GC pressure. Rely on explicit\n  disposal or being kept alive with the view until it's cleared.\n- **Parent owns children:** When a parent View is disposed, it should dispose its children.\n- **Weak references:** For internal caches or event handlers, use WeakReference to avoid\n  circular dependencies.\n\n## Summary\n\n- Only custom Views implement `IDisposable` (opt-in) — built-in Views do not\n- Disposal is recursive: when a View is disposed, children that implement `IDisposable` are disposed too\n- Use this contract to clean up `Bind()` subscriptions and other resources\n- Platform integration will make this automatic (future)\n"
  },
  {
    "path": "global.json",
    "content": "{\n  \"msbuild-sdks\": {\n    \"Microsoft.Build.NoTargets\": \"3.7.56\"\n  }\n}"
  },
  {
    "path": "samples/HeadToHeadMaui/App.xaml",
    "content": "﻿<?xml version = \"1.0\" encoding = \"UTF-8\" ?>\n<Application xmlns=\"http://schemas.microsoft.com/dotnet/2021/maui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2009/xaml\"\n             xmlns:local=\"clr-namespace:HeadToHeadMaui\"\n             x:Class=\"HeadToHeadMaui.App\">\n    <Application.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"Resources/Styles/Colors.xaml\" />\n                <ResourceDictionary Source=\"Resources/Styles/Styles.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n        </ResourceDictionary>\n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "samples/HeadToHeadMaui/App.xaml.cs",
    "content": "﻿namespace HeadToHeadMaui;\n\npublic partial class App : Application\n{\n\tpublic App()\n\t{\n\t\tInitializeComponent();\n\n\t\tMainPage = new AppShell();\n\t}\n}\n"
  },
  {
    "path": "samples/HeadToHeadMaui/AppShell.xaml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<Shell\n    x:Class=\"HeadToHeadMaui.AppShell\"\n    xmlns=\"http://schemas.microsoft.com/dotnet/2021/maui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2009/xaml\"\n    xmlns:local=\"clr-namespace:HeadToHeadMaui\"\n    Shell.FlyoutBehavior=\"Disabled\">\n\n    <ShellContent\n        Title=\"Home\"\n        ContentTemplate=\"{DataTemplate local:MainPage}\"\n        Route=\"MainPage\" />\n\n</Shell>\n"
  },
  {
    "path": "samples/HeadToHeadMaui/AppShell.xaml.cs",
    "content": "﻿namespace HeadToHeadMaui;\n\npublic partial class AppShell : Shell\n{\n\tpublic AppShell()\n\t{\n\t\tInitializeComponent();\n\t}\n}\n"
  },
  {
    "path": "samples/HeadToHeadMaui/HeadToHeadMaui.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n\t<PropertyGroup>\n\t\t<TargetFrameworks>net10.0-android;net10.0-ios</TargetFrameworks>\n\t\t<TargetFrameworks Condition=\"$([MSBuild]::IsOSPlatform('windows'))\">$(TargetFrameworks);net10.0-windows10.0.19041.0</TargetFrameworks>\n\t\t<!-- Uncomment to also build the tizen app. You will need to install tizen by following this: https://github.com/Samsung/Tizen.NET -->\n\t\t<!-- <TargetFrameworks>$(TargetFrameworks);net10.0-tizen</TargetFrameworks> -->\n\t\t<OutputType>Exe</OutputType>\n\t\t<RootNamespace>HeadToHeadMaui</RootNamespace>\n\t\t<UseMaui>true</UseMaui>\n\t\t<SingleProject>true</SingleProject>\n\t\t<ImplicitUsings>enable</ImplicitUsings>\n\n\t\t<!-- Display name -->\n\t\t<ApplicationTitle>HeadToHeadMaui</ApplicationTitle>\n\n\t\t<!-- App Identifier -->\n\t\t<ApplicationId>com.companyname.headtoheadmaui</ApplicationId>\n\t\t<ApplicationIdGuid>fc6b6cda-cd30-40ab-9968-ef7e9e292c2d</ApplicationIdGuid>\n\n\t\t<!-- Versions -->\n\t\t<ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>\n\t\t<ApplicationVersion>1</ApplicationVersion>\n\n\t\t<SupportedOSPlatformVersion Condition=\"$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'\">16.0</SupportedOSPlatformVersion>\n\t\t<SupportedOSPlatformVersion Condition=\"$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'\">21.0</SupportedOSPlatformVersion>\n\t\t<SupportedOSPlatformVersion Condition=\"$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'\">10.0.17763.0</SupportedOSPlatformVersion>\n\t\t<TargetPlatformMinVersion Condition=\"$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'\">10.0.17763.0</TargetPlatformMinVersion>\n\t\t<SupportedOSPlatformVersion Condition=\"$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'tizen'\">6.5</SupportedOSPlatformVersion>\n\t\t<AndroidLinkTool Condition=\"'$(Configuration)' == 'Release'\">r8</AndroidLinkTool>\n\t\t<RuntimeIdentifier Condition=\"'$(Configuration)' == 'Release' and $([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'\">android-arm64</RuntimeIdentifier>\n\t</PropertyGroup>\n\n\t<ItemGroup>\n\t\t<!-- App Icon -->\n\t\t<MauiIcon Include=\"Resources\\AppIcon\\appicon.svg\" ForegroundFile=\"Resources\\AppIcon\\appiconfg.svg\" Color=\"#512BD4\" />\n\n\t\t<!-- Splash Screen -->\n\t\t<MauiSplashScreen Include=\"Resources\\Splash\\splash.svg\" Color=\"#512BD4\" BaseSize=\"128,128\" />\n\n\t\t<!-- Images -->\n\t\t<MauiImage Include=\"Resources\\Images\\*\" />\n\t\t<MauiImage Update=\"Resources\\Images\\dotnet_bot.svg\" BaseSize=\"168,208\" />\n\n\t\t<!-- Custom Fonts -->\n\t\t<MauiFont Include=\"Resources\\Fonts\\*\" />\n\n\t\t<!-- Raw Assets (also remove the \"Resources\\Raw\" prefix) -->\n\t\t<MauiAsset Include=\"Resources\\Raw\\**\" LogicalName=\"%(RecursiveDir)%(Filename)%(Extension)\" />\n\t</ItemGroup>\n\n\t<ItemGroup>\n\t\t<PackageReference Include=\"Microsoft.Extensions.Logging.Debug\" Version=\"10.0.3\" />\n\t</ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "samples/HeadToHeadMaui/HeadToHeadMaui.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.0.31611.283\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"HeadToHeadMaui\", \"HeadToHeadMaui.csproj\", \"{B221E782-7C39-468D-8FCB-F16F24A90A2E}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{B221E782-7C39-468D-8FCB-F16F24A90A2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B221E782-7C39-468D-8FCB-F16F24A90A2E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B221E782-7C39-468D-8FCB-F16F24A90A2E}.Debug|Any CPU.Deploy.0 = Debug|Any CPU\n\t\t{B221E782-7C39-468D-8FCB-F16F24A90A2E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B221E782-7C39-468D-8FCB-F16F24A90A2E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B221E782-7C39-468D-8FCB-F16F24A90A2E}.Release|Any CPU.Deploy.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {61F7FB11-1E47-470C-91E2-47F8143E1572}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "samples/HeadToHeadMaui/MainPage.xaml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<ContentPage xmlns=\"http://schemas.microsoft.com/dotnet/2021/maui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2009/xaml\"\n             x:Class=\"HeadToHeadMaui.MainPage\">\n\n    <VerticalStackLayout\n        Spacing=\"25\"\n        Padding=\"30,0\"\n        VerticalOptions=\"Center\">\n\n        <Image\n            Source=\"dotnet_bot.png\"\n            SemanticProperties.Description=\"Cute dot net bot waving hi to you!\"\n            HeightRequest=\"200\"\n            HorizontalOptions=\"Center\" />\n\n        <Label\n            Text=\"Hello, World!\"\n            SemanticProperties.HeadingLevel=\"Level1\"\n            FontSize=\"32\"\n            HorizontalOptions=\"Center\" />\n\n        <Label\n            Text=\"Welcome to .NET Multi-platform App UI\"\n            SemanticProperties.HeadingLevel=\"Level2\"\n            SemanticProperties.Description=\"Welcome to dot net Multi platform App U I\"\n            FontSize=\"18\"\n            HorizontalOptions=\"Center\" />\n\n        <Button\n            x:Name=\"CounterBtn\"\n            Text=\"Click me\"\n            SemanticProperties.Hint=\"Counts the number of times you click\"\n            Clicked=\"OnCounterClicked\"\n            HorizontalOptions=\"Center\" />\n\n    </VerticalStackLayout>\n\n</ContentPage>\n"
  },
  {
    "path": "samples/HeadToHeadMaui/MainPage.xaml.cs",
    "content": "﻿namespace HeadToHeadMaui;\n\npublic partial class MainPage : ContentPage\n{\n\tint count = 0;\n\n\tpublic MainPage()\n\t{\n\t\tInitializeComponent();\n\t}\n\n\tprivate void OnCounterClicked(object sender, EventArgs e)\n\t{\n\t\tcount++;\n\n\t\tif (count == 1)\n\t\t\tCounterBtn.Text = $\"Clicked {count} time\";\n\t\telse\n\t\t\tCounterBtn.Text = $\"Clicked {count} times\";\n\n\t\tSemanticScreenReader.Announce(CounterBtn.Text);\n\t}\n}\n\n"
  },
  {
    "path": "samples/HeadToHeadMaui/MauiProgram.cs",
    "content": "﻿using Microsoft.Extensions.Logging;\n\nnamespace HeadToHeadMaui;\n\npublic static class MauiProgram\n{\n\tpublic static MauiApp CreateMauiApp()\n\t{\n\t\tvar builder = MauiApp.CreateBuilder();\n\t\tbuilder\n\t\t\t.UseMauiApp<App>()\n\t\t\t.ConfigureFonts(fonts =>\n\t\t\t{\n\t\t\t\tfonts.AddFont(\"OpenSans-Regular.ttf\", \"OpenSansRegular\");\n\t\t\t\tfonts.AddFont(\"OpenSans-Semibold.ttf\", \"OpenSansSemibold\");\n\t\t\t});\n\n#if DEBUG\n\t\tbuilder.Logging.AddDebug();\n#endif\n\n\t\treturn builder.Build();\n\t}\n}\n"
  },
  {
    "path": "samples/HeadToHeadMaui/Platforms/Android/AndroidManifest.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\t<application android:allowBackup=\"true\" android:icon=\"@mipmap/appicon\" android:roundIcon=\"@mipmap/appicon_round\" android:supportsRtl=\"true\"></application>\n\t<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n\t<uses-permission android:name=\"android.permission.INTERNET\" />\n</manifest>"
  },
  {
    "path": "samples/HeadToHeadMaui/Platforms/Android/MainActivity.cs",
    "content": "﻿using Android.App;\nusing Android.Content.PM;\nusing Android.OS;\n\nnamespace HeadToHeadMaui;\n\n[Activity(Theme = \"@style/Maui.SplashTheme\", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]\npublic class MainActivity : MauiAppCompatActivity\n{\n}\n"
  },
  {
    "path": "samples/HeadToHeadMaui/Platforms/Android/MainApplication.cs",
    "content": "﻿using Android.App;\nusing Android.Runtime;\n\nnamespace HeadToHeadMaui;\n\n[Application]\npublic class MainApplication : MauiApplication\n{\n\tpublic MainApplication(IntPtr handle, JniHandleOwnership ownership)\n\t\t: base(handle, ownership)\n\t{\n\t}\n\n\tprotected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();\n}\n"
  },
  {
    "path": "samples/HeadToHeadMaui/Platforms/Android/Resources/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#512BD4</color>\n    <color name=\"colorPrimaryDark\">#2B0B98</color>\n    <color name=\"colorAccent\">#2B0B98</color>\n</resources>"
  },
  {
    "path": "samples/HeadToHeadMaui/Platforms/MacCatalyst/AppDelegate.cs",
    "content": "﻿using Foundation;\n\nnamespace HeadToHeadMaui;\n\n[Register(\"AppDelegate\")]\npublic class AppDelegate : MauiUIApplicationDelegate\n{\n\tprotected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();\n}\n"
  },
  {
    "path": "samples/HeadToHeadMaui/Platforms/MacCatalyst/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>UIDeviceFamily</key>\n\t<array>\n\t\t<integer>1</integer>\n\t\t<integer>2</integer>\n\t</array>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>arm64</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>XSAppIconAssets</key>\n\t<string>Assets.xcassets/appicon.appiconset</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "samples/HeadToHeadMaui/Platforms/MacCatalyst/Program.cs",
    "content": "﻿using ObjCRuntime;\nusing UIKit;\n\nnamespace HeadToHeadMaui;\n\npublic class Program\n{\n\t// This is the main entry point of the application.\n\tstatic void Main(string[] args)\n\t{\n\t\t// if you want to use a different Application Delegate class from \"AppDelegate\"\n\t\t// you can specify it here.\n\t\tUIApplication.Main(args, null, typeof(AppDelegate));\n\t}\n}\n"
  },
  {
    "path": "samples/HeadToHeadMaui/Platforms/Tizen/Main.cs",
    "content": "using System;\nusing Microsoft.Maui;\nusing Microsoft.Maui.Hosting;\n\nnamespace HeadToHeadMaui;\n\nclass Program : MauiApplication\n{\n\tprotected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();\n\n\tstatic void Main(string[] args)\n\t{\n\t\tvar app = new Program();\n\t\tapp.Run(args);\n\t}\n}\n"
  },
  {
    "path": "samples/HeadToHeadMaui/Platforms/Tizen/tizen-manifest.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"maui-application-id-placeholder\" version=\"0.0.0\" api-version=\"7\" xmlns=\"http://tizen.org/ns/packages\">\n  <profile name=\"common\" />\n  <ui-application appid=\"maui-application-id-placeholder\" exec=\"HeadToHeadMaui.dll\" multiple=\"false\" nodisplay=\"false\" taskmanage=\"true\" type=\"dotnet\" launch_mode=\"single\">\n    <label>maui-application-title-placeholder</label>\n    <icon>maui-appicon-placeholder</icon>\n    <metadata key=\"http://tizen.org/metadata/prefer_dotnet_aot\" value=\"true\" />\n  </ui-application>\n  <shortcut-list />\n  <privileges>\n    <privilege>http://tizen.org/privilege/internet</privilege>\n  </privileges> \n  <dependencies />\n  <provides-appdefined-privileges />\n</manifest>"
  },
  {
    "path": "samples/HeadToHeadMaui/Platforms/Windows/App.xaml",
    "content": "﻿<maui:MauiWinUIApplication\n    x:Class=\"HeadToHeadMaui.WinUI.App\"\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:maui=\"using:Microsoft.Maui\"\n    xmlns:local=\"using:HeadToHeadMaui.WinUI\">\n\n</maui:MauiWinUIApplication>\n"
  },
  {
    "path": "samples/HeadToHeadMaui/Platforms/Windows/App.xaml.cs",
    "content": "﻿using Microsoft.UI.Xaml;\n\n// To learn more about WinUI, the WinUI project structure,\n// and more about our project templates, see: http://aka.ms/winui-project-info.\n\nnamespace HeadToHeadMaui.WinUI;\n\n/// <summary>\n/// Provides application-specific behavior to supplement the default Application class.\n/// </summary>\npublic partial class App : MauiWinUIApplication\n{\n\t/// <summary>\n\t/// Initializes the singleton application object.  This is the first line of authored code\n\t/// executed, and as such is the logical equivalent of main() or WinMain().\n\t/// </summary>\n\tpublic App()\n\t{\n\t\tthis.InitializeComponent();\n\t}\n\n\tprotected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();\n}\n\n"
  },
  {
    "path": "samples/HeadToHeadMaui/Platforms/Windows/Package.appxmanifest",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Package\n  xmlns=\"http://schemas.microsoft.com/appx/manifest/foundation/windows10\"\n  xmlns:uap=\"http://schemas.microsoft.com/appx/manifest/uap/windows10\"\n  xmlns:mp=\"http://schemas.microsoft.com/appx/2014/phone/manifest\"\n  xmlns:rescap=\"http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities\"\n  IgnorableNamespaces=\"uap rescap\">\n\n  <Identity Name=\"maui-package-name-placeholder\" Publisher=\"CN=User Name\" Version=\"0.0.0.0\" />\n\n  <mp:PhoneIdentity PhoneProductId=\"C48D4BDF-BAE8-4D50-802E-2C74FA1491C7\" PhonePublisherId=\"00000000-0000-0000-0000-000000000000\"/>\n\n  <Properties>\n    <DisplayName>$placeholder$</DisplayName>\n    <PublisherDisplayName>User Name</PublisherDisplayName>\n    <Logo>$placeholder$.png</Logo>\n  </Properties>\n\n  <Dependencies>\n    <TargetDeviceFamily Name=\"Windows.Universal\" MinVersion=\"10.0.17763.0\" MaxVersionTested=\"10.0.19041.0\" />\n    <TargetDeviceFamily Name=\"Windows.Desktop\" MinVersion=\"10.0.17763.0\" MaxVersionTested=\"10.0.19041.0\" />\n  </Dependencies>\n\n  <Resources>\n    <Resource Language=\"x-generate\" />\n  </Resources>\n\n  <Applications>\n    <Application Id=\"App\" Executable=\"$targetnametoken$.exe\" EntryPoint=\"$targetentrypoint$\">\n      <uap:VisualElements\n        DisplayName=\"$placeholder$\"\n        Description=\"$placeholder$\"\n        Square150x150Logo=\"$placeholder$.png\"\n        Square44x44Logo=\"$placeholder$.png\"\n        BackgroundColor=\"transparent\">\n        <uap:DefaultTile Square71x71Logo=\"$placeholder$.png\" Wide310x150Logo=\"$placeholder$.png\" Square310x310Logo=\"$placeholder$.png\" />\n        <uap:SplashScreen Image=\"$placeholder$.png\" />\n      </uap:VisualElements>\n    </Application>\n  </Applications>\n\n  <Capabilities>\n    <rescap:Capability Name=\"runFullTrust\" />\n  </Capabilities>\n\n</Package>\n"
  },
  {
    "path": "samples/HeadToHeadMaui/Platforms/Windows/app.manifest",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<assembly manifestVersion=\"1.0\" xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n  <assemblyIdentity version=\"1.0.0.0\" name=\"HeadToHeadMaui.WinUI.app\"/>\n\n  <application xmlns=\"urn:schemas-microsoft-com:asm.v3\">\n    <windowsSettings>\n      <!-- The combination of below two tags have the following effect:\n           1) Per-Monitor for >= Windows 10 Anniversary Update\n           2) System < Windows 10 Anniversary Update\n      -->\n      <dpiAware xmlns=\"http://schemas.microsoft.com/SMI/2005/WindowsSettings\">true/PM</dpiAware>\n      <dpiAwareness xmlns=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">PerMonitorV2, PerMonitor</dpiAwareness>\n    </windowsSettings>\n  </application>\n</assembly>\n"
  },
  {
    "path": "samples/HeadToHeadMaui/Platforms/iOS/AppDelegate.cs",
    "content": "﻿using Foundation;\n\nnamespace HeadToHeadMaui;\n\n[Register(\"AppDelegate\")]\npublic class AppDelegate : MauiUIApplicationDelegate\n{\n\tprotected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();\n}\n"
  },
  {
    "path": "samples/HeadToHeadMaui/Platforms/iOS/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIDeviceFamily</key>\n\t<array>\n\t\t<integer>1</integer>\n\t\t<integer>2</integer>\n\t</array>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>arm64</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>XSAppIconAssets</key>\n\t<string>Assets.xcassets/appicon.appiconset</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "samples/HeadToHeadMaui/Platforms/iOS/Program.cs",
    "content": "﻿using ObjCRuntime;\nusing UIKit;\n\nnamespace HeadToHeadMaui;\n\npublic class Program\n{\n\t// This is the main entry point of the application.\n\tstatic void Main(string[] args)\n\t{\n\t\t// if you want to use a different Application Delegate class from \"AppDelegate\"\n\t\t// you can specify it here.\n\t\tUIApplication.Main(args, null, typeof(AppDelegate));\n\t}\n}\n"
  },
  {
    "path": "samples/HeadToHeadMaui/Properties/launchSettings.json",
    "content": "{\n  \"profiles\": {\n    \"Windows Machine\": {\n      \"commandName\": \"MsixPackage\",\n      \"nativeDebugging\": false\n    }\n  }\n}"
  },
  {
    "path": "samples/HeadToHeadMaui/Resources/Raw/AboutAssets.txt",
    "content": "﻿Any raw assets you want to be deployed with your application can be placed in\nthis directory (and child directories). Deployment of the asset to your application\nis automatically handled by the following `MauiAsset` Build Action within your `.csproj`.\n\n\t<MauiAsset Include=\"Resources\\Raw\\**\" LogicalName=\"%(RecursiveDir)%(Filename)%(Extension)\" />\n\nThese files will be deployed with you package and will be accessible using Essentials:\n\n\tasync Task LoadMauiAsset()\n\t{\n\t\tusing var stream = await FileSystem.OpenAppPackageFileAsync(\"AboutAssets.txt\");\n\t\tusing var reader = new StreamReader(stream);\n\n\t\tvar contents = reader.ReadToEnd();\n\t}\n"
  },
  {
    "path": "samples/HeadToHeadMaui/Resources/Styles/Colors.xaml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<?xaml-comp compile=\"true\" ?>\n<ResourceDictionary \n    xmlns=\"http://schemas.microsoft.com/dotnet/2021/maui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2009/xaml\">\n\n    <Color x:Key=\"Primary\">#512BD4</Color>\n    <Color x:Key=\"Secondary\">#DFD8F7</Color>\n    <Color x:Key=\"Tertiary\">#2B0B98</Color>\n    <Color x:Key=\"White\">White</Color>\n    <Color x:Key=\"Black\">Black</Color>\n    <Color x:Key=\"Gray100\">#E1E1E1</Color>\n    <Color x:Key=\"Gray200\">#C8C8C8</Color>\n    <Color x:Key=\"Gray300\">#ACACAC</Color>\n    <Color x:Key=\"Gray400\">#919191</Color>\n    <Color x:Key=\"Gray500\">#6E6E6E</Color>\n    <Color x:Key=\"Gray600\">#404040</Color>\n    <Color x:Key=\"Gray900\">#212121</Color>\n    <Color x:Key=\"Gray950\">#141414</Color>\n    <SolidColorBrush x:Key=\"PrimaryBrush\" Color=\"{StaticResource Primary}\"/>\n    <SolidColorBrush x:Key=\"SecondaryBrush\" Color=\"{StaticResource Secondary}\"/>\n    <SolidColorBrush x:Key=\"TertiaryBrush\" Color=\"{StaticResource Tertiary}\"/>\n    <SolidColorBrush x:Key=\"WhiteBrush\" Color=\"{StaticResource White}\"/>\n    <SolidColorBrush x:Key=\"BlackBrush\" Color=\"{StaticResource Black}\"/>\n    <SolidColorBrush x:Key=\"Gray100Brush\" Color=\"{StaticResource Gray100}\"/>\n    <SolidColorBrush x:Key=\"Gray200Brush\" Color=\"{StaticResource Gray200}\"/>\n    <SolidColorBrush x:Key=\"Gray300Brush\" Color=\"{StaticResource Gray300}\"/>\n    <SolidColorBrush x:Key=\"Gray400Brush\" Color=\"{StaticResource Gray400}\"/>\n    <SolidColorBrush x:Key=\"Gray500Brush\" Color=\"{StaticResource Gray500}\"/>\n    <SolidColorBrush x:Key=\"Gray600Brush\" Color=\"{StaticResource Gray600}\"/>\n    <SolidColorBrush x:Key=\"Gray900Brush\" Color=\"{StaticResource Gray900}\"/>\n    <SolidColorBrush x:Key=\"Gray950Brush\" Color=\"{StaticResource Gray950}\"/>\n\n    <Color x:Key=\"Yellow100Accent\">#F7B548</Color>\n    <Color x:Key=\"Yellow200Accent\">#FFD590</Color>\n    <Color x:Key=\"Yellow300Accent\">#FFE5B9</Color>\n    <Color x:Key=\"Cyan100Accent\">#28C2D1</Color>\n    <Color x:Key=\"Cyan200Accent\">#7BDDEF</Color>\n    <Color x:Key=\"Cyan300Accent\">#C3F2F4</Color>\n    <Color x:Key=\"Blue100Accent\">#3E8EED</Color>\n    <Color x:Key=\"Blue200Accent\">#72ACF1</Color>\n    <Color x:Key=\"Blue300Accent\">#A7CBF6</Color>\n\n</ResourceDictionary>"
  },
  {
    "path": "samples/HeadToHeadMaui/Resources/Styles/Styles.xaml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<?xaml-comp compile=\"true\" ?>\n<ResourceDictionary \n    xmlns=\"http://schemas.microsoft.com/dotnet/2021/maui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2009/xaml\">\n\n    <Style TargetType=\"ActivityIndicator\">\n        <Setter Property=\"Color\" Value=\"{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}\" />\n    </Style>\n\n    <Style TargetType=\"IndicatorView\">\n        <Setter Property=\"IndicatorColor\" Value=\"{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}\"/>\n        <Setter Property=\"SelectedIndicatorColor\" Value=\"{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray100}}\"/>\n    </Style>\n\n    <Style TargetType=\"Border\">\n        <Setter Property=\"Stroke\" Value=\"{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}\" />\n        <Setter Property=\"StrokeShape\" Value=\"Rectangle\"/>\n        <Setter Property=\"StrokeThickness\" Value=\"1\"/>\n    </Style>\n\n    <Style TargetType=\"BoxView\">\n        <Setter Property=\"Color\" Value=\"{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}\" />\n    </Style>\n\n    <Style TargetType=\"Button\">\n        <Setter Property=\"TextColor\" Value=\"{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Primary}}\" />\n        <Setter Property=\"BackgroundColor\" Value=\"{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}\" />\n        <Setter Property=\"FontFamily\" Value=\"OpenSansRegular\"/>\n        <Setter Property=\"FontSize\" Value=\"14\"/>\n        <Setter Property=\"CornerRadius\" Value=\"8\"/>\n        <Setter Property=\"Padding\" Value=\"14,10\"/>\n        <Setter Property=\"MinimumHeightRequest\" Value=\"44\"/>\n        <Setter Property=\"MinimumWidthRequest\" Value=\"44\"/>\n        <Setter Property=\"VisualStateManager.VisualStateGroups\">\n            <VisualStateGroupList>\n                <VisualStateGroup x:Name=\"CommonStates\">\n                    <VisualState x:Name=\"Normal\" />\n                    <VisualState x:Name=\"Disabled\">\n                        <VisualState.Setters>\n                            <Setter Property=\"TextColor\" Value=\"{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}\" />\n                            <Setter Property=\"BackgroundColor\" Value=\"{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray600}}\" />\n                        </VisualState.Setters>\n                    </VisualState>\n                </VisualStateGroup>\n            </VisualStateGroupList>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"CheckBox\">\n        <Setter Property=\"Color\" Value=\"{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}\" />\n        <Setter Property=\"MinimumHeightRequest\" Value=\"44\"/>\n        <Setter Property=\"MinimumWidthRequest\" Value=\"44\"/>\n        <Setter Property=\"VisualStateManager.VisualStateGroups\">\n            <VisualStateGroupList>\n                <VisualStateGroup x:Name=\"CommonStates\">\n                    <VisualState x:Name=\"Normal\" />\n                    <VisualState x:Name=\"Disabled\">\n                        <VisualState.Setters>\n                            <Setter Property=\"Color\" Value=\"{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}\" />\n                        </VisualState.Setters>\n                    </VisualState>\n                </VisualStateGroup>\n            </VisualStateGroupList>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"DatePicker\">\n        <Setter Property=\"TextColor\" Value=\"{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}\" />\n        <Setter Property=\"BackgroundColor\" Value=\"Transparent\" />\n        <Setter Property=\"FontFamily\" Value=\"OpenSansRegular\"/>\n        <Setter Property=\"FontSize\" Value=\"14\"/>\n        <Setter Property=\"MinimumHeightRequest\" Value=\"44\"/>\n        <Setter Property=\"MinimumWidthRequest\" Value=\"44\"/>\n        <Setter Property=\"VisualStateManager.VisualStateGroups\">\n            <VisualStateGroupList>\n                <VisualStateGroup x:Name=\"CommonStates\">\n                    <VisualState x:Name=\"Normal\" />\n                    <VisualState x:Name=\"Disabled\">\n                        <VisualState.Setters>\n                            <Setter Property=\"TextColor\" Value=\"{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}\" />\n                        </VisualState.Setters>\n                    </VisualState>\n                </VisualStateGroup>\n            </VisualStateGroupList>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"Editor\">\n        <Setter Property=\"TextColor\" Value=\"{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}\" />\n        <Setter Property=\"BackgroundColor\" Value=\"Transparent\" />\n        <Setter Property=\"FontFamily\" Value=\"OpenSansRegular\"/>\n        <Setter Property=\"FontSize\" Value=\"14\" />\n        <Setter Property=\"PlaceholderColor\" Value=\"{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}\" />\n        <Setter Property=\"MinimumHeightRequest\" Value=\"44\"/>\n        <Setter Property=\"MinimumWidthRequest\" Value=\"44\"/>\n        <Setter Property=\"VisualStateManager.VisualStateGroups\">\n            <VisualStateGroupList>\n                <VisualStateGroup x:Name=\"CommonStates\">\n                    <VisualState x:Name=\"Normal\" />\n                    <VisualState x:Name=\"Disabled\">\n                        <VisualState.Setters>\n                            <Setter Property=\"TextColor\" Value=\"{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}\" />\n                        </VisualState.Setters>\n                    </VisualState>\n                </VisualStateGroup>\n            </VisualStateGroupList>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"Entry\">\n        <Setter Property=\"TextColor\" Value=\"{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}\" />\n        <Setter Property=\"BackgroundColor\" Value=\"Transparent\" />\n        <Setter Property=\"FontFamily\" Value=\"OpenSansRegular\"/>\n        <Setter Property=\"FontSize\" Value=\"14\" />\n        <Setter Property=\"PlaceholderColor\" Value=\"{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}\" />\n        <Setter Property=\"MinimumHeightRequest\" Value=\"44\"/>\n        <Setter Property=\"MinimumWidthRequest\" Value=\"44\"/>\n        <Setter Property=\"VisualStateManager.VisualStateGroups\">\n            <VisualStateGroupList>\n                <VisualStateGroup x:Name=\"CommonStates\">\n                    <VisualState x:Name=\"Normal\" />\n                    <VisualState x:Name=\"Disabled\">\n                        <VisualState.Setters>\n                            <Setter Property=\"TextColor\" Value=\"{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}\" />\n                        </VisualState.Setters>\n                    </VisualState>\n                </VisualStateGroup>\n            </VisualStateGroupList>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"Frame\">\n        <Setter Property=\"HasShadow\" Value=\"False\" />\n        <Setter Property=\"BorderColor\" Value=\"{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}\" />\n        <Setter Property=\"CornerRadius\" Value=\"8\" />\n    </Style>\n\n    <Style TargetType=\"ImageButton\">\n        <Setter Property=\"Opacity\" Value=\"1\" />\n        <Setter Property=\"BorderColor\" Value=\"Transparent\"/>\n        <Setter Property=\"BorderWidth\" Value=\"0\"/>\n        <Setter Property=\"CornerRadius\" Value=\"0\"/>\n        <Setter Property=\"MinimumHeightRequest\" Value=\"44\"/>\n        <Setter Property=\"MinimumWidthRequest\" Value=\"44\"/>\n        <Setter Property=\"VisualStateManager.VisualStateGroups\">\n            <VisualStateGroupList>\n                <VisualStateGroup x:Name=\"CommonStates\">\n                    <VisualState x:Name=\"Normal\" />\n                    <VisualState x:Name=\"Disabled\">\n                        <VisualState.Setters>\n                            <Setter Property=\"Opacity\" Value=\"0.5\" />\n                        </VisualState.Setters>\n                    </VisualState>\n                </VisualStateGroup>\n            </VisualStateGroupList>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"Label\">\n        <Setter Property=\"TextColor\" Value=\"{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}\" />\n        <Setter Property=\"BackgroundColor\" Value=\"Transparent\" />\n        <Setter Property=\"FontFamily\" Value=\"OpenSansRegular\" />\n        <Setter Property=\"FontSize\" Value=\"14\" />\n        <Setter Property=\"VisualStateManager.VisualStateGroups\">\n            <VisualStateGroupList>\n                <VisualStateGroup x:Name=\"CommonStates\">\n                    <VisualState x:Name=\"Normal\" />\n                    <VisualState x:Name=\"Disabled\">\n                        <VisualState.Setters>\n                            <Setter Property=\"TextColor\" Value=\"{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}\" />\n                        </VisualState.Setters>\n                    </VisualState>\n                </VisualStateGroup>\n            </VisualStateGroupList>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"ListView\">\n        <Setter Property=\"SeparatorColor\" Value=\"{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}\" />\n        <Setter Property=\"RefreshControlColor\" Value=\"{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}\" />\n    </Style>\n\n    <Style TargetType=\"Picker\">\n        <Setter Property=\"TextColor\" Value=\"{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}\" />\n        <Setter Property=\"TitleColor\" Value=\"{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}\" />\n        <Setter Property=\"BackgroundColor\" Value=\"Transparent\" />\n        <Setter Property=\"FontFamily\" Value=\"OpenSansRegular\"/>\n        <Setter Property=\"FontSize\" Value=\"14\"/>\n        <Setter Property=\"MinimumHeightRequest\" Value=\"44\"/>\n        <Setter Property=\"MinimumWidthRequest\" Value=\"44\"/>\n        <Setter Property=\"VisualStateManager.VisualStateGroups\">\n            <VisualStateGroupList>\n                <VisualStateGroup x:Name=\"CommonStates\">\n                    <VisualState x:Name=\"Normal\" />\n                    <VisualState x:Name=\"Disabled\">\n                        <VisualState.Setters>\n                            <Setter Property=\"TextColor\" Value=\"{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}\" />\n                            <Setter Property=\"TitleColor\" Value=\"{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}\" />\n                        </VisualState.Setters>\n                    </VisualState>\n                </VisualStateGroup>\n            </VisualStateGroupList>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"ProgressBar\">\n        <Setter Property=\"ProgressColor\" Value=\"{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}\" />\n        <Setter Property=\"VisualStateManager.VisualStateGroups\">\n            <VisualStateGroupList>\n                <VisualStateGroup x:Name=\"CommonStates\">\n                    <VisualState x:Name=\"Normal\" />\n                    <VisualState x:Name=\"Disabled\">\n                        <VisualState.Setters>\n                            <Setter Property=\"ProgressColor\" Value=\"{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}\" />\n                        </VisualState.Setters>\n                    </VisualState>\n                </VisualStateGroup>\n            </VisualStateGroupList>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"RadioButton\">\n        <Setter Property=\"BackgroundColor\" Value=\"Transparent\"/>\n        <Setter Property=\"TextColor\" Value=\"{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}\" />\n        <Setter Property=\"FontFamily\" Value=\"OpenSansRegular\"/>\n        <Setter Property=\"FontSize\" Value=\"14\"/>\n        <Setter Property=\"MinimumHeightRequest\" Value=\"44\"/>\n        <Setter Property=\"MinimumWidthRequest\" Value=\"44\"/>\n        <Setter Property=\"VisualStateManager.VisualStateGroups\">\n            <VisualStateGroupList>\n                <VisualStateGroup x:Name=\"CommonStates\">\n                    <VisualState x:Name=\"Normal\" />\n                    <VisualState x:Name=\"Disabled\">\n                        <VisualState.Setters>\n                            <Setter Property=\"TextColor\" Value=\"{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}\" />\n                        </VisualState.Setters>\n                    </VisualState>\n                </VisualStateGroup>\n            </VisualStateGroupList>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"RefreshView\">\n        <Setter Property=\"RefreshColor\" Value=\"{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}\" />\n    </Style>\n\n    <Style TargetType=\"SearchBar\">\n        <Setter Property=\"TextColor\" Value=\"{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}\" />\n        <Setter Property=\"PlaceholderColor\" Value=\"{StaticResource Gray500}\" />\n        <Setter Property=\"CancelButtonColor\" Value=\"{StaticResource Gray500}\" />\n        <Setter Property=\"BackgroundColor\" Value=\"Transparent\" />\n        <Setter Property=\"FontFamily\" Value=\"OpenSansRegular\" />\n        <Setter Property=\"FontSize\" Value=\"14\" />\n        <Setter Property=\"MinimumHeightRequest\" Value=\"44\"/>\n        <Setter Property=\"MinimumWidthRequest\" Value=\"44\"/>\n        <Setter Property=\"VisualStateManager.VisualStateGroups\">\n            <VisualStateGroupList>\n                <VisualStateGroup x:Name=\"CommonStates\">\n                    <VisualState x:Name=\"Normal\" />\n                    <VisualState x:Name=\"Disabled\">\n                        <VisualState.Setters>\n                            <Setter Property=\"TextColor\" Value=\"{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}\" />\n                            <Setter Property=\"PlaceholderColor\" Value=\"{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}\" />\n                        </VisualState.Setters>\n                    </VisualState>\n                </VisualStateGroup>\n            </VisualStateGroupList>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"SearchHandler\">\n        <Setter Property=\"TextColor\" Value=\"{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}\" />\n        <Setter Property=\"PlaceholderColor\" Value=\"{StaticResource Gray500}\" />\n        <Setter Property=\"BackgroundColor\" Value=\"Transparent\" />\n        <Setter Property=\"FontFamily\" Value=\"OpenSansRegular\" />\n        <Setter Property=\"FontSize\" Value=\"14\" />\n        <Setter Property=\"VisualStateManager.VisualStateGroups\">\n            <VisualStateGroupList>\n                <VisualStateGroup x:Name=\"CommonStates\">\n                    <VisualState x:Name=\"Normal\" />\n                    <VisualState x:Name=\"Disabled\">\n                        <VisualState.Setters>\n                            <Setter Property=\"TextColor\" Value=\"{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}\" />\n                            <Setter Property=\"PlaceholderColor\" Value=\"{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}\" />\n                        </VisualState.Setters>\n                    </VisualState>\n                </VisualStateGroup>\n            </VisualStateGroupList>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"Shadow\">\n        <Setter Property=\"Radius\" Value=\"15\" />\n        <Setter Property=\"Opacity\" Value=\"0.5\" />\n        <Setter Property=\"Brush\" Value=\"{AppThemeBinding Light={StaticResource White}, Dark={StaticResource White}}\" />\n        <Setter Property=\"Offset\" Value=\"10,10\" />\n    </Style>\n\n    <Style TargetType=\"Slider\">\n        <Setter Property=\"MinimumTrackColor\" Value=\"{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}\" />\n        <Setter Property=\"MaximumTrackColor\" Value=\"{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray600}}\" />\n        <Setter Property=\"ThumbColor\" Value=\"{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}\" />\n        <Setter Property=\"VisualStateManager.VisualStateGroups\">\n            <VisualStateGroupList>\n                <VisualStateGroup x:Name=\"CommonStates\">\n                    <VisualState x:Name=\"Normal\" />\n                    <VisualState x:Name=\"Disabled\">\n                        <VisualState.Setters>\n                            <Setter Property=\"MinimumTrackColor\" Value=\"{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}\"/>\n                            <Setter Property=\"MaximumTrackColor\" Value=\"{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}\"/>\n                            <Setter Property=\"ThumbColor\" Value=\"{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}\"/>\n                        </VisualState.Setters>\n                    </VisualState>\n                </VisualStateGroup>\n            </VisualStateGroupList>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"SwipeItem\">\n        <Setter Property=\"BackgroundColor\" Value=\"{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Black}}\" />\n    </Style>\n\n    <Style TargetType=\"Switch\">\n        <Setter Property=\"OnColor\" Value=\"{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}\" />\n        <Setter Property=\"ThumbColor\" Value=\"{StaticResource White}\" />\n        <Setter Property=\"VisualStateManager.VisualStateGroups\">\n            <VisualStateGroupList>\n                <VisualStateGroup x:Name=\"CommonStates\">\n                    <VisualState x:Name=\"Normal\" />\n                    <VisualState x:Name=\"Disabled\">\n                        <VisualState.Setters>\n                            <Setter Property=\"OnColor\" Value=\"{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}\" />\n                            <Setter Property=\"ThumbColor\" Value=\"{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}\" />\n                        </VisualState.Setters>\n                    </VisualState>\n                    <VisualState x:Name=\"On\">\n                        <VisualState.Setters>\n                            <Setter Property=\"OnColor\" Value=\"{AppThemeBinding Light={StaticResource Secondary}, Dark={StaticResource Gray200}}\" />\n                            <Setter Property=\"ThumbColor\" Value=\"{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}\" />\n                        </VisualState.Setters>\n                    </VisualState>\n                    <VisualState x:Name=\"Off\">\n                        <VisualState.Setters>\n                            <Setter Property=\"ThumbColor\" Value=\"{AppThemeBinding Light={StaticResource Gray400}, Dark={StaticResource Gray500}}\" />\n                        </VisualState.Setters>\n                    </VisualState>\n                </VisualStateGroup>\n            </VisualStateGroupList>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"TimePicker\">\n        <Setter Property=\"TextColor\" Value=\"{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}\" />\n        <Setter Property=\"BackgroundColor\" Value=\"Transparent\"/>\n        <Setter Property=\"FontFamily\" Value=\"OpenSansRegular\"/>\n        <Setter Property=\"FontSize\" Value=\"14\"/>\n        <Setter Property=\"MinimumHeightRequest\" Value=\"44\"/>\n        <Setter Property=\"MinimumWidthRequest\" Value=\"44\"/>\n        <Setter Property=\"VisualStateManager.VisualStateGroups\">\n            <VisualStateGroupList>\n                <VisualStateGroup x:Name=\"CommonStates\">\n                    <VisualState x:Name=\"Normal\" />\n                    <VisualState x:Name=\"Disabled\">\n                        <VisualState.Setters>\n                            <Setter Property=\"TextColor\" Value=\"{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}\" />\n                        </VisualState.Setters>\n                    </VisualState>\n                </VisualStateGroup>\n            </VisualStateGroupList>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"Page\" ApplyToDerivedTypes=\"True\">\n        <Setter Property=\"Padding\" Value=\"0\"/>\n        <Setter Property=\"BackgroundColor\" Value=\"{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Black}}\" />\n    </Style>\n\n    <Style TargetType=\"Shell\" ApplyToDerivedTypes=\"True\">\n        <Setter Property=\"Shell.BackgroundColor\" Value=\"{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource Gray950}}\" />\n        <Setter Property=\"Shell.ForegroundColor\" Value=\"{OnPlatform WinUI={StaticResource Primary}, Default={StaticResource White}}\" />\n        <Setter Property=\"Shell.TitleColor\" Value=\"{AppThemeBinding Light={StaticResource White}, Dark={StaticResource White}}\" />\n        <Setter Property=\"Shell.DisabledColor\" Value=\"{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}\" />\n        <Setter Property=\"Shell.UnselectedColor\" Value=\"{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray200}}\" />\n        <Setter Property=\"Shell.NavBarHasShadow\" Value=\"False\" />\n        <Setter Property=\"Shell.TabBarBackgroundColor\" Value=\"{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Black}}\" />\n        <Setter Property=\"Shell.TabBarForegroundColor\" Value=\"{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}\" />\n        <Setter Property=\"Shell.TabBarTitleColor\" Value=\"{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}\" />\n        <Setter Property=\"Shell.TabBarUnselectedColor\" Value=\"{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}\" />\n    </Style>\n\n    <Style TargetType=\"NavigationPage\">\n        <Setter Property=\"BarBackgroundColor\" Value=\"{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource Gray950}}\" />\n        <Setter Property=\"BarTextColor\" Value=\"{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource White}}\" />\n        <Setter Property=\"IconColor\" Value=\"{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource White}}\" />\n    </Style>\n\n    <Style TargetType=\"TabbedPage\">\n        <Setter Property=\"BarBackgroundColor\" Value=\"{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Gray950}}\" />\n        <Setter Property=\"BarTextColor\" Value=\"{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}\" />\n        <Setter Property=\"UnselectedTabColor\" Value=\"{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}\" />\n        <Setter Property=\"SelectedTabColor\" Value=\"{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}\" />\n    </Style>\n\n</ResourceDictionary>\n"
  },
  {
    "path": "samples/HeadToHeadSpice/App.cs",
    "content": "﻿namespace HeadToHeadSpice;\n\n/// <summary>\n/// NOTE: this app is for comparing head-to-head `dotnet new maui`\n/// </summary>\npublic class App : Application\n{\n\tpublic App()\n\t{\n\t\tint count = 0;\n\n\t\tMain = new StackLayout\n\t\t{\n\t\t\tnew Image { Source = \"dotnet_bot\" },\n\t\t\tnew Label { Text = \"Hello, World!\" },\n\t\t\tnew Label { Text = \"Welcome to Spice 🌶!\" },\n\t\t\tnew Button\n\t\t\t{\n\t\t\t\tText = \"Click me\",\n\t\t\t\tClicked = b =>\n\t\t\t\t{\n\t\t\t\t\tif (++count == 1)\n\t\t\t\t\t\tb.Text = $\"Clicked {count} time\";\n\t\t\t\t\telse\n\t\t\t\t\t\tb.Text = $\"Clicked {count} times\";\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n}"
  },
  {
    "path": "samples/HeadToHeadSpice/GlobalUsings.cs",
    "content": "﻿global using Microsoft.Maui.Graphics;\nglobal using Spice;\n"
  },
  {
    "path": "samples/HeadToHeadSpice/HeadToHeadSpice.csproj",
    "content": "<Project>\n\n\t<Import Project=\"../../src/Spice/MSBuild/Spice.props\" />\n\t<Import Sdk=\"Microsoft.NET.Sdk\" Project=\"Sdk.props\" />\n\n\t<PropertyGroup>\n\t\t<TargetFrameworks>net10.0-android;net10.0-ios</TargetFrameworks>\n\t\t<OutputType>Exe</OutputType>\n\t\t<UseMauiAssets>true</UseMauiAssets>\n\t\t<SingleProject>true</SingleProject>\n\t\t<ImplicitUsings>enable</ImplicitUsings>\n\t\t<Nullable>enable</Nullable>\n\t\t<ApplicationTitle>HeadToHeadSpice</ApplicationTitle>\n\t\t<ApplicationId>com.companyname.HeadToHeadSpice</ApplicationId>\n\t\t<ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>\n\t\t<ApplicationVersion>1</ApplicationVersion>\n\t\t<SupportedOSPlatformVersion Condition=\"$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'\">16.0</SupportedOSPlatformVersion>\n\t\t<SupportedOSPlatformVersion Condition=\"$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'\">21.0</SupportedOSPlatformVersion>\n\t\t<AndroidLinkTool Condition=\"'$(Configuration)' == 'Release'\">r8</AndroidLinkTool>\n\t\t<RuntimeIdentifier Condition=\"'$(Configuration)' == 'Release' and $([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'\">android-arm64</RuntimeIdentifier>\n\t</PropertyGroup>\n\n\t<ItemGroup>\n\t<!-- App Icon -->\n\t<MauiIcon Include=\"Resources\\AppIcon\\appicon.svg\" ForegroundFile=\"Resources\\AppIcon\\appiconfg.svg\" Color=\"#512BD4\" />\n\n\t<!-- Splash Screen -->\n\t<MauiSplashScreen Include=\"Resources\\Splash\\splash.svg\" Color=\"#512BD4\" BaseSize=\"128,128\" />\n\n\t<!-- Images -->\n\t<MauiImage Include=\"Resources\\Images\\*\" />\n\t<MauiImage Update=\"Resources\\Images\\spice.svg\" BaseSize=\"168,208\" />\n\n\t<!-- Custom Fonts -->\n\t<MauiFont Include=\"Resources\\Fonts\\*\" />\n\n\t<!-- Raw Assets (also remove the \"Resources\\Raw\" prefix) -->\n\t<MauiAsset Include=\"Resources\\Raw\\**\" LogicalName=\"%(RecursiveDir)%(Filename)%(Extension)\" />\n\t</ItemGroup>\n\n\t<ItemGroup>\n\t\t<ProjectReference Include=\"..\\..\\src\\Spice\\Spice.csproj\" />\n\t\t<PackageReference Include=\"Microsoft.Maui.Resizetizer\" />\n\t</ItemGroup>\n\n\t<Import Sdk=\"Microsoft.NET.Sdk\" Project=\"Sdk.targets\" />\n\t<Import Project=\"../../src/Spice/MSBuild/Spice.targets\" />\n</Project>"
  },
  {
    "path": "samples/HeadToHeadSpice/Platforms/Android/AndroidManifest.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\t<application android:allowBackup=\"true\" android:icon=\"@mipmap/appicon\" android:roundIcon=\"@mipmap/appicon_round\" android:supportsRtl=\"true\"></application>\n\t<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n\t<uses-permission android:name=\"android.permission.INTERNET\" />\n</manifest>"
  },
  {
    "path": "samples/HeadToHeadSpice/Platforms/Android/MainActivity.cs",
    "content": "﻿using Android.App;\nusing Android.OS;\n\nnamespace HeadToHeadSpice;\n\n[Activity(\n\tTheme = \"@style/Theme.Material3.Light.NoActionBar\",\n\tMainLauncher = true)]\npublic class MainActivity : SpiceActivity\n{\n\tprotected override void OnCreate(Bundle? savedInstanceState)\n\t{\n\t\tbase.OnCreate(savedInstanceState);\n\n\t\tSetContentView(new App());\n\t}\n}"
  },
  {
    "path": "samples/HeadToHeadSpice/Platforms/iOS/AppDelegate.cs",
    "content": "﻿using Foundation;\n\nnamespace HeadToHeadSpice;\n\n[Register(\"AppDelegate\")]\npublic class AppDelegate : SpiceAppDelegate\n{\n\tpublic override Application CreateApplication() => new App();\n}"
  },
  {
    "path": "samples/HeadToHeadSpice/Platforms/iOS/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIDeviceFamily</key>\n\t<array>\n\t\t<integer>1</integer>\n\t\t<integer>2</integer>\n\t</array>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>arm64</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>XSAppIconAssets</key>\n\t<string>Assets.xcassets/appicon.appiconset</string>\n\t<key>UIApplicationSceneManifest</key>\n\t<dict>\n\t\t<key>UIApplicationSupportsMultipleScenes</key>\n\t\t<false/>\n\t\t<key>UISceneConfigurations</key>\n\t\t<dict>\n\t\t\t<key>UIWindowSceneSessionRoleApplication</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>UISceneConfigurationName</key>\n\t\t\t\t\t<string>Default Configuration</string>\n\t\t\t\t\t<key>UISceneDelegateClassName</key>\n\t\t\t\t\t<string>SpiceSceneDelegate</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "samples/HeadToHeadSpice/Platforms/iOS/Program.cs",
    "content": "﻿using UIKit;\nusing HeadToHeadSpice;\n\nUIApplication.Main(args, null, typeof(AppDelegate));"
  },
  {
    "path": "samples/README.md",
    "content": "# Samples\n\n* `Spice.Scenarios` - first sample to get things working, may get renamed\n* `HeadToHeadMaui` - for comparing Spice vs Maui\n* `HeadToHeadSpice` - for comparing Spice vs Maui"
  },
  {
    "path": "samples/Spice.BlazorSample/App.cs",
    "content": "﻿namespace Spice.BlazorSample;\n\npublic class App : Application\n{\n\tpublic App()\n\t{\n\t\tMain = new BlazorWebView\n\t\t{\n\t\t\tHostPage = \"wwwroot/index.html\",\n\t\t\tRootComponents =\n\t\t\t{\n\t\t\t\tnew RootComponent { Selector = \"#app\", ComponentType = typeof(Main) }\n\t\t\t},\n\t\t};\n\t}\n}"
  },
  {
    "path": "samples/Spice.BlazorSample/GlobalUsings.cs",
    "content": "﻿global using Microsoft.Maui.Graphics;\nglobal using Spice;\n"
  },
  {
    "path": "samples/Spice.BlazorSample/Main.razor",
    "content": "<Router AppAssembly=\"typeof(Main).Assembly\">\n    <Found Context=\"routeData\">\n        <RouteView RouteData=\"routeData\" DefaultLayout=\"typeof(MainLayout)\" />\n        <FocusOnNavigate RouteData=\"routeData\" Selector=\"h1\" />\n    </Found>\n    <NotFound>\n        <p role=\"alert\">Sorry, there's nothing at this address.</p>\n    </NotFound>\n</Router>"
  },
  {
    "path": "samples/Spice.BlazorSample/Pages/Index.razor",
    "content": "﻿@page \"/\"\n\n<h1>Hello, Spice + Blazor 🌶!</h1>\n\nWelcome to your new app."
  },
  {
    "path": "samples/Spice.BlazorSample/Platforms/Android/AndroidManifest.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\t<application android:allowBackup=\"true\" android:icon=\"@mipmap/appicon\" android:roundIcon=\"@mipmap/appicon_round\" android:supportsRtl=\"true\"></application>\n\t<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n\t<uses-permission android:name=\"android.permission.INTERNET\" />\n</manifest>"
  },
  {
    "path": "samples/Spice.BlazorSample/Platforms/Android/MainActivity.cs",
    "content": "﻿using Android.App;\nusing Android.OS;\n\nnamespace Spice.BlazorSample;\n\n[Activity(\n\t// TODO: fix splash theme\n\t// Theme = \"@style/Maui.SplashTheme\", \n\tTheme = \"@style/Theme.Material3.Light.NoActionBar\",\n\tMainLauncher = true)]\npublic class MainActivity : SpiceActivity\n{\n\tprotected override void OnCreate(Bundle? savedInstanceState)\n\t{\n\t\tbase.OnCreate(savedInstanceState);\n\n\t\tSetContentView(new App());\n\t}\n}"
  },
  {
    "path": "samples/Spice.BlazorSample/Platforms/iOS/AppDelegate.cs",
    "content": "﻿using Foundation;\n\nnamespace Spice.BlazorSample;\n\n[Register(\"AppDelegate\")]\npublic class AppDelegate : SpiceAppDelegate\n{\n\tpublic override Application CreateApplication() => new App();\n}"
  },
  {
    "path": "samples/Spice.BlazorSample/Platforms/iOS/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIDeviceFamily</key>\n\t<array>\n\t\t<integer>1</integer>\n\t\t<integer>2</integer>\n\t</array>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>arm64</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>XSAppIconAssets</key>\n\t<string>Assets.xcassets/appicon.appiconset</string>\n\t<key>UIApplicationSceneManifest</key>\n\t<dict>\n\t\t<key>UIApplicationSupportsMultipleScenes</key>\n\t\t<false/>\n\t\t<key>UISceneConfigurations</key>\n\t\t<dict>\n\t\t\t<key>UIWindowSceneSessionRoleApplication</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>UISceneConfigurationName</key>\n\t\t\t\t\t<string>Default Configuration</string>\n\t\t\t\t\t<key>UISceneDelegateClassName</key>\n\t\t\t\t\t<string>SpiceSceneDelegate</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "samples/Spice.BlazorSample/Platforms/iOS/Program.cs",
    "content": "﻿using UIKit;\nusing Spice.BlazorSample;\n\nUIApplication.Main(args, null, typeof(AppDelegate));"
  },
  {
    "path": "samples/Spice.BlazorSample/Shared/MainLayout.razor",
    "content": "@inherits LayoutComponentBase\n\n<div class=\"page\">\n    <div class=\"sidebar\">\n        <NavMenu />\n    </div>\n\n    <main>\n        <div class=\"top-row px-4\">\n            <a href=\"https://docs.microsoft.com/aspnet/\" target=\"_blank\">About</a>\n        </div>\n\n        <article class=\"content px-4\">\n            @Body\n        </article>\n    </main>\n</div>\n"
  },
  {
    "path": "samples/Spice.BlazorSample/Shared/MainLayout.razor.css",
    "content": ".page {\n    position: relative;\n    display: flex;\n    flex-direction: column;\n}\n\nmain {\n    flex: 1;\n}\n\n.sidebar {\n    background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);\n}\n\n.top-row {\n    background-color: #f7f7f7;\n    border-bottom: 1px solid #d6d5d5;\n    justify-content: flex-end;\n    height: 3.5rem;\n    display: flex;\n    align-items: center;\n}\n\n    .top-row ::deep a, .top-row ::deep .btn-link {\n        white-space: nowrap;\n        margin-left: 1.5rem;\n        text-decoration: none;\n    }\n\n    .top-row ::deep a:hover, .top-row ::deep .btn-link:hover {\n        text-decoration: underline;\n    }\n\n    .top-row ::deep a:first-child {\n        overflow: hidden;\n        text-overflow: ellipsis;\n    }\n\n@media (max-width: 640.98px) {\n    .top-row:not(.auth) {\n        display: none;\n    }\n\n    .top-row.auth {\n        justify-content: space-between;\n    }\n\n    .top-row ::deep a, .top-row ::deep .btn-link {\n        margin-left: 0;\n    }\n}\n\n@media (min-width: 641px) {\n    .page {\n        flex-direction: row;\n    }\n\n    .sidebar {\n        width: 250px;\n        height: 100vh;\n        position: sticky;\n        top: 0;\n    }\n\n    .top-row {\n        position: sticky;\n        top: 0;\n        z-index: 1;\n    }\n\n    .top-row, article {\n        padding-left: 2rem !important;\n        padding-right: 1.5rem !important;\n    }\n}\n"
  },
  {
    "path": "samples/Spice.BlazorSample/Shared/NavMenu.razor",
    "content": "<div class=\"top-row ps-3 navbar navbar-dark\">\n    <div class=\"container-fluid\">\n        <a class=\"navbar-brand\" href=\"\">Hello Blazor</a>\n        <button title=\"Navigation menu\" class=\"navbar-toggler\" @onclick=\"ToggleNavMenu\">\n            <span class=\"navbar-toggler-icon\"></span>\n        </button>\n    </div>\n</div>\n\n<div class=\"@NavMenuCssClass\" @onclick=\"ToggleNavMenu\">\n    <nav class=\"flex-column\">\n        <div class=\"nav-item px-3\">\n            <NavLink class=\"nav-link\" href=\"\" Match=\"NavLinkMatch.All\">\n                <span class=\"oi oi-home\" aria-hidden=\"true\"></span> Home\n            </NavLink>\n        </div>\n    </nav>\n</div>\n\n@code {\n    private bool collapseNavMenu = true;\n\n    private string NavMenuCssClass => collapseNavMenu ? \"collapse\" : \"\";\n\n    private void ToggleNavMenu()\n    {\n        collapseNavMenu = !collapseNavMenu;\n    }\n}\n"
  },
  {
    "path": "samples/Spice.BlazorSample/Shared/NavMenu.razor.css",
    "content": ".navbar-toggler {\n    background-color: rgba(255, 255, 255, 0.1);\n}\n\n.top-row {\n    height: 3.5rem;\n    background-color: rgba(0,0,0,0.4);\n}\n\n.navbar-brand {\n    font-size: 1.1rem;\n}\n\n.oi {\n    width: 2rem;\n    font-size: 1.1rem;\n    vertical-align: text-top;\n    top: -2px;\n}\n\n.nav-item {\n    font-size: 0.9rem;\n    padding-bottom: 0.5rem;\n}\n\n    .nav-item:first-of-type {\n        padding-top: 1rem;\n    }\n\n    .nav-item:last-of-type {\n        padding-bottom: 1rem;\n    }\n\n    .nav-item ::deep a {\n        color: #d7d7d7;\n        border-radius: 4px;\n        height: 3rem;\n        display: flex;\n        align-items: center;\n        line-height: 3rem;\n    }\n\n.nav-item ::deep a.active {\n    background-color: rgba(255,255,255,0.25);\n    color: white;\n}\n\n.nav-item ::deep a:hover {\n    background-color: rgba(255,255,255,0.1);\n    color: white;\n}\n\n@media (min-width: 641px) {\n    .navbar-toggler {\n        display: none;\n    }\n\n    .collapse {\n        /* Never collapse the sidebar for wide screens */\n        display: block;\n    }\n}\n"
  },
  {
    "path": "samples/Spice.BlazorSample/Spice.BlazorSample.csproj",
    "content": "﻿<Project>\n\n    <Import Sdk=\"Microsoft.NET.Sdk.Razor\" Project=\"Sdk.props\" />\n    <Import Project=\"../../src/Spice/MSBuild/Spice.props\" />\n\n    <PropertyGroup>\n        <TargetFrameworks>net10.0-android;net10.0-ios</TargetFrameworks>\n        <OutputType>Exe</OutputType>\n        <RootNamespace>Spice.BlazorSample</RootNamespace>\n        <UseMauiAssets>true</UseMauiAssets>\n        <SingleProject>true</SingleProject>\n        <ImplicitUsings>enable</ImplicitUsings>\n        <Nullable>enable</Nullable>\n        <ApplicationTitle>Hello Blazor</ApplicationTitle>\n        <ApplicationId>com.companyname.spice.blazor</ApplicationId>\n        <ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>\n        <ApplicationVersion>1</ApplicationVersion>\n        <SupportedOSPlatformVersion Condition=\"$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'\">16.0</SupportedOSPlatformVersion>\n        <SupportedOSPlatformVersion Condition=\"$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'\">23.0</SupportedOSPlatformVersion>\n        <RuntimeIdentifier Condition=\"'$(GITHUB_ACTIONS)' == 'true' and $([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'\">android-arm64</RuntimeIdentifier>\n        <EnableDefaultCssItems>false</EnableDefaultCssItems>\n        <AndroidPackageFormat>apk</AndroidPackageFormat>\n        <!-- https://github.com/dotnet/aspnetcore/issues/63951 — Blazor doesn't support full trimming -->\n        <NoWarn>$(NoWarn);IL2026;IL2065;IL2067;IL2072;IL2104;IL2110;IL2111;IL2121</NoWarn>\n    </PropertyGroup>\n\n    <ItemGroup>\n        <!-- App Icon -->\n        <MauiIcon Include=\"Resources\\AppIcon\\appicon.svg\" ForegroundFile=\"Resources\\AppIcon\\appiconfg.svg\" Color=\"#512BD4\" />\n\n        <!-- Splash Screen -->\n        <MauiSplashScreen Include=\"Resources\\Splash\\splash.svg\" Color=\"#512BD4\" BaseSize=\"128,128\" />\n\n        <!-- Images -->\n        <MauiImage Include=\"Resources\\Images\\*\" />\n        <MauiImage Update=\"Resources\\Images\\spice.svg\" BaseSize=\"168,208\" />\n\n        <!-- Custom Fonts -->\n        <MauiFont Include=\"Resources\\Fonts\\*\" />\n\n        <!-- Raw Assets (also remove the \"Resources\\Raw\" prefix) -->\n        <MauiAsset Include=\"Resources\\Raw\\**\" LogicalName=\"%(RecursiveDir)%(Filename)%(Extension)\" />\n    </ItemGroup>\n\n    <ItemGroup>\n        <ProjectReference Include=\"..\\..\\src\\Spice\\Spice.csproj\" />\n        <PackageReference Include=\"Microsoft.Maui.Resizetizer\" />\n    </ItemGroup>\n\n    <Import Sdk=\"Microsoft.NET.Sdk.Razor\" Project=\"Sdk.targets\" />\n    <Import Project=\"../../src/Spice/MSBuild/Spice.targets\" />\n</Project>\n"
  },
  {
    "path": "samples/Spice.BlazorSample/_Imports.razor",
    "content": "﻿@using System.Net.Http\n@using Microsoft.AspNetCore.Components.Forms\n@using Microsoft.AspNetCore.Components.Routing\n@using Microsoft.AspNetCore.Components.Web\n@using Microsoft.AspNetCore.Components.Web.Virtualization\n@using Microsoft.JSInterop\n@using Spice.BlazorSample\n@using Spice.BlazorSample.Shared"
  },
  {
    "path": "samples/Spice.BlazorSample/wwwroot/css/app.css",
    "content": "﻿@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');\n\nhtml, body {\n    font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n}\n\nh1:focus {\n    outline: none;\n}\n\na, .btn-link {\n    color: #0071c1;\n}\n\n.btn-primary {\n    color: #fff;\n    background-color: #1b6ec2;\n    border-color: #1861ac;\n}\n\n.content {\n    padding-top: 1.1rem;\n}\n\n.valid.modified:not([type=checkbox]) {\n    outline: 1px solid #26b050;\n}\n\n.invalid {\n    outline: 1px solid red;\n}\n\n.validation-message {\n    color: red;\n}\n\n#blazor-error-ui {\n    background: lightyellow;\n    bottom: 0;\n    box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);\n    display: none;\n    left: 0;\n    padding: 0.6rem 1.25rem 0.7rem 1.25rem;\n    position: fixed;\n    width: 100%;\n    z-index: 1000;\n}\n\n#blazor-error-ui .dismiss {\n    cursor: pointer;\n    position: absolute;\n    right: 0.75rem;\n    top: 0.5rem;\n}\n\n.blazor-error-boundary {\n    background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;\n    padding: 1rem 1rem 1rem 3.7rem;\n    color: white;\n}\n\n.blazor-error-boundary::after {\n    content: \"An error has occurred.\"\n}\n\n.status-bar-safe-area {\n    display: none;\n}\n\n@supports (-webkit-touch-callout: none) {\n    .status-bar-safe-area {\n        display: flex;\n        position: sticky;\n        top: 0;\n        height: env(safe-area-inset-top);\n        background-color: #f7f7f7;\n        width: 100%;\n        z-index: 1;\n    }\n\n    .flex-column, .navbar-brand {\n        padding-left: env(safe-area-inset-left);\n    }\n}\n"
  },
  {
    "path": "samples/Spice.BlazorSample/wwwroot/css/open-iconic/FONT-LICENSE",
    "content": "SIL OPEN FONT LICENSE Version 1.1\n\nCopyright (c) 2014 Waybury\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to stimulate worldwide\ndevelopment of collaborative font projects, to support the font creation\nefforts of academic and linguistic communities, and to provide a free and\nopen framework in which fonts may be shared and improved in partnership\nwith others.\n\nThe OFL allows the licensed fonts to be used, studied, modified and\nredistributed freely as long as they are not sold by themselves. The\nfonts, including any derivative works, can be bundled, embedded,\nredistributed and/or sold with any software provided that any reserved\nnames are not used by derivative works. The fonts and derivatives,\nhowever, cannot be released under any other type of license. The\nrequirement for fonts to remain under this license does not apply\nto any document created using the fonts or their derivatives.\n\nDEFINITIONS\n\"Font Software\" refers to the set of files released by the Copyright\nHolder(s) under this license and clearly marked as such. This may\ninclude source files, build scripts and documentation.\n\n\"Reserved Font Name\" refers to any names specified as such after the\ncopyright statement(s).\n\n\"Original Version\" refers to the collection of Font Software components as\ndistributed by the Copyright Holder(s).\n\n\"Modified Version\" refers to any derivative made by adding to, deleting,\nor substituting -- in part or in whole -- any of the components of the\nOriginal Version, by changing formats or by porting the Font Software to a\nnew environment.\n\n\"Author\" refers to any designer, engineer, programmer, technical\nwriter or other person who contributed to the Font Software.\n\nPERMISSION & CONDITIONS\nPermission is hereby granted, free of charge, to any person obtaining\na copy of the Font Software, to use, study, copy, merge, embed, modify,\nredistribute, and sell modified and unmodified copies of the Font\nSoftware, subject to the following conditions:\n\n1) Neither the Font Software nor any of its individual components,\nin Original or Modified Versions, may be sold by itself.\n\n2) Original or Modified Versions of the Font Software may be bundled,\nredistributed and/or sold with any software, provided that each copy\ncontains the above copyright notice and this license. These can be\nincluded either as stand-alone text files, human-readable headers or\nin the appropriate machine-readable metadata fields within text or\nbinary files as long as those fields can be easily viewed by the user.\n\n3) No Modified Version of the Font Software may use the Reserved Font\nName(s) unless explicit written permission is granted by the corresponding\nCopyright Holder. This restriction only applies to the primary font name as\npresented to the users.\n\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\nSoftware shall not be used to promote, endorse or advertise any\nModified Version, except to acknowledge the contribution(s) of the\nCopyright Holder(s) and the Author(s) or with their explicit written\npermission.\n\n5) The Font Software, modified or unmodified, in part or in whole,\nmust be distributed entirely under this license, and must not be\ndistributed under any other license. The requirement for fonts to\nremain under this license does not apply to any document created\nusing the Font Software.\n\nTERMINATION\nThis license becomes null and void if any of the above conditions are\nnot met.\n\nDISCLAIMER\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\nOTHER DEALINGS IN THE FONT SOFTWARE.\n"
  },
  {
    "path": "samples/Spice.BlazorSample/wwwroot/css/open-iconic/ICON-LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Waybury\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "samples/Spice.BlazorSample/wwwroot/css/open-iconic/README.md",
    "content": "[Open Iconic v1.1.1](https://github.com/iconic/open-iconic)\n===========\n\n### Open Iconic is the open source sibling of [Iconic](https://github.com/iconic/open-iconic). It is a hyper-legible collection of 223 icons with a tiny footprint&mdash;ready to use with Bootstrap and Foundation. [View the collection](https://github.com/iconic/open-iconic)\n\n\n\n## What's in Open Iconic?\n\n* 223 icons designed to be legible down to 8 pixels\n* Super-light SVG files - 61.8 for the entire set \n* SVG sprite&mdash;the modern replacement for icon fonts\n* Webfont (EOT, OTF, SVG, TTF, WOFF), PNG and WebP formats\n* Webfont stylesheets (including versions for Bootstrap and Foundation) in CSS, LESS, SCSS and Stylus formats\n* PNG and WebP raster images in 8px, 16px, 24px, 32px, 48px and 64px.\n\n\n## Getting Started\n\n#### For code samples and everything else you need to get started with Open Iconic, check out our [Icons](https://github.com/iconic/open-iconic) and [Reference](https://github.com/iconic/open-iconic) sections.\n\n### General Usage\n\n#### Using Open Iconic's SVGs\n\nWe like SVGs and we think they're the way to display icons on the web. Since Open Iconic are just basic SVGs, we suggest you display them like you would any other image (don't forget the `alt` attribute).\n\n```\n<img src=\"/open-iconic/svg/icon-name.svg\" alt=\"icon name\">\n```\n\n#### Using Open Iconic's SVG Sprite\n\nOpen Iconic also comes in a SVG sprite which allows you to display all the icons in the set with a single request. It's like an icon font, without being a hack.\n\nAdding an icon from an SVG sprite is a little different than what you're used to, but it's still a piece of cake. *Tip: To make your icons easily style able, we suggest adding a general class to the* `<svg>` *tag and a unique class name for each different icon in the* `<use>` *tag.*  \n\n```\n<svg class=\"icon\">\n  <use xlink:href=\"open-iconic.svg#account-login\" class=\"icon-account-login\"></use>\n</svg>\n```\n\nSizing icons only needs basic CSS. All the icons are in a square format, so just set the `<svg>` tag with equal width and height dimensions.\n\n```\n.icon {\n  width: 16px;\n  height: 16px;\n}\n```\n\nColoring icons is even easier. All you need to do is set the `fill` rule on the `<use>` tag.\n\n```\n.icon-account-login {\n  fill: #f00;\n}\n```\n\nTo learn more about SVG Sprites, read [Chris Coyier's guide](http://css-tricks.com/svg-sprites-use-better-icon-fonts/).\n\n#### Using Open Iconic's Icon Font...\n\n\n##### …with Bootstrap\n\nYou can find our Bootstrap stylesheets in `font/css/open-iconic-bootstrap.{css, less, scss, styl}`\n\n\n```\n<link href=\"/open-iconic/font/css/open-iconic-bootstrap.css\" rel=\"stylesheet\">\n```\n\n\n```\n<span class=\"oi oi-icon-name\" title=\"icon name\" aria-hidden=\"true\"></span>\n```\n\n##### …with Foundation\n\nYou can find our Foundation stylesheets in `font/css/open-iconic-foundation.{css, less, scss, styl}`\n\n```\n<link href=\"/open-iconic/font/css/open-iconic-foundation.css\" rel=\"stylesheet\">\n```\n\n\n```\n<span class=\"fi-icon-name\" title=\"icon name\" aria-hidden=\"true\"></span>\n```\n\n##### …on its own\n\nYou can find our default stylesheets in `font/css/open-iconic.{css, less, scss, styl}`\n\n```\n<link href=\"/open-iconic/font/css/open-iconic.css\" rel=\"stylesheet\">\n```\n\n```\n<span class=\"oi\" data-glyph=\"icon-name\" title=\"icon name\" aria-hidden=\"true\"></span>\n```\n\n\n## License\n\n### Icons\n\nAll code (including SVG markup) is under the [MIT License](http://opensource.org/licenses/MIT).\n\n### Fonts\n\nAll fonts are under the [SIL Licensed](http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web).\n"
  },
  {
    "path": "samples/Spice.BlazorSample/wwwroot/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover\" />\n    <title>Hello Blazor</title>\n    <base href=\"/\" />\n    <link rel=\"stylesheet\" href=\"css/bootstrap/bootstrap.min.css\" />\n    <link href=\"css/app.css\" rel=\"stylesheet\" />\n    <link href=\"Spice.BlazorSample.styles.css\" rel=\"stylesheet\" />\n</head>\n\n<body>\n\n    <div class=\"status-bar-safe-area\"></div>\n\n    <div id=\"app\">Loading...</div>\n\n    <div id=\"blazor-error-ui\">\n        An unhandled error has occurred.\n        <a href=\"\" class=\"reload\">Reload</a>\n        <a class=\"dismiss\">🗙</a>\n    </div>\n\n    <script src=\"_framework/blazor.webview.js\" autostart=\"false\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "samples/Spice.Scenarios/App.cs",
    "content": "﻿namespace Spice.Scenarios;\n\npublic class App : Application\n{\n\tpublic App()\n\t{\n\t\tUseSystemTheme = true;\n\n\t\tMain = new NavigationView(new ScenarioList());\n\t}\n}\n\nclass ScenarioList : StackLayout\n{\n\tpublic ScenarioList()\n\t{\n\t\tTitle = \"Scenarios\";\n\n\t\tAdd(new Button { Text = \"Hello World\", Clicked = _ => Navigation!.Push<HelloWorldScenario>() });\n\t\tAdd(new Button { Text = \"Ghost Button\", Clicked = _ => Navigation!.Push<GhostButtonScenario>() });\n\t\tAdd(new Button { Text = \"ImageButton\", Clicked = _ => Navigation!.Push<ImageButtonScenario>() });\n\t\tAdd(new Button { Text = \"WebView\", Clicked = _ => Navigation!.Push<WebViewScenario>() });\n\t\tAdd(new Button { Text = \"Entry\", Clicked = _ => Navigation!.Push<EntryScenario>() });\n\t\tAdd(new Button { Text = \"Editor\", Clicked = _ => Navigation!.Push<EditorScenario>() });\n\t\tAdd(new Button { Text = \"DatePicker\", Clicked = _ => Navigation!.Push<DatePickerScenario>() });\n\t\tAdd(new Button { Text = \"TimePicker\", Clicked = _ => Navigation!.Push<TimePickerScenario>() });\n\t\tAdd(new Button { Text = \"ActivityIndicator\", Clicked = _ => Navigation!.Push<ActivityIndicatorScenario>() });\n\t\tAdd(new Button { Text = \"BoxView\", Clicked = _ => Navigation!.Push<BoxViewScenario>() });\n\t\tAdd(new Button { Text = \"Switch\", Clicked = _ => Navigation!.Push<SwitchScenario>() });\n\t\tAdd(new Button { Text = \"ProgressBar\", Clicked = _ => Navigation!.Push<ProgressBarScenario>() });\n\t\tAdd(new Button { Text = \"ScrollView\", Clicked = _ => Navigation!.Push<ScrollViewScenario>() });\n\t\tAdd(new Button { Text = \"RefreshView\", Clicked = _ => Navigation!.Push<RefreshViewScenario>() });\n\t\tAdd(new Button { Text = \"Picker\", Clicked = _ => Navigation!.Push<PickerScenario>() });\n\t\tAdd(new Button { Text = \"CheckBox\", Clicked = _ => Navigation!.Push<CheckBoxScenario>() });\n\t\tAdd(new Button { Text = \"ContentView\", Clicked = _ => Navigation!.Push<ContentViewScenario>() });\n\t\tAdd(new Button { Text = \"Slider\", Clicked = _ => Navigation!.Push<SliderScenario>() });\n\t\tAdd(new Button { Text = \"Border\", Clicked = _ => Navigation!.Push<BorderScenario>() });\n\t\tAdd(new Button { Text = \"Margin\", Clicked = _ => Navigation!.Push<MarginScenario>() });\n\t\tAdd(new Button { Text = \"CollectionView\", Clicked = _ => Navigation!.Push<CollectionViewScenario>() });\n\t\tAdd(new Button { Text = \"SearchBar\", Clicked = _ => Navigation!.Push<SearchBarScenario>() });\n\t\tAdd(new Button { Text = \"SwipeView\", Clicked = _ => Navigation!.Push<SwipeViewScenario>() });\n\t\tAdd(new Button { Text = \"Theme\", Clicked = _ => Navigation!.Push<ThemeScenario>() });\n\t}\n}"
  },
  {
    "path": "samples/Spice.Scenarios/GlobalUsings.cs",
    "content": "﻿global using Microsoft.Maui.Graphics;\nglobal using Spice;\n"
  },
  {
    "path": "samples/Spice.Scenarios/Platforms/Android/AndroidManifest.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\t<application android:allowBackup=\"true\" android:icon=\"@mipmap/appicon\" android:roundIcon=\"@mipmap/appicon_round\" android:supportsRtl=\"true\"></application>\n\t<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n\t<uses-permission android:name=\"android.permission.INTERNET\" />\n</manifest>"
  },
  {
    "path": "samples/Spice.Scenarios/Platforms/Android/MainActivity.cs",
    "content": "﻿using Android.App;\nusing Android.OS;\n\nnamespace Spice.Scenarios;\n\n[Activity(\n\t// TODO: fix splash theme\n\t// Theme = \"@style/Maui.SplashTheme\", \n\tTheme = \"@style/Theme.Material3.Light.NoActionBar\",\n\tMainLauncher = true)]\npublic class MainActivity : SpiceActivity\n{\n\tprotected override void OnCreate(Bundle? savedInstanceState)\n\t{\n\t\tbase.OnCreate(savedInstanceState);\n\n\t\tSetContentView(new App());\n\t}\n}"
  },
  {
    "path": "samples/Spice.Scenarios/Platforms/iOS/AppDelegate.cs",
    "content": "﻿using Foundation;\n\nnamespace Spice.Scenarios;\n\n[Register(\"AppDelegate\")]\npublic class AppDelegate : SpiceAppDelegate\n{\n\tpublic override Application CreateApplication() => new App();\n}"
  },
  {
    "path": "samples/Spice.Scenarios/Platforms/iOS/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIDeviceFamily</key>\n\t<array>\n\t\t<integer>1</integer>\n\t\t<integer>2</integer>\n\t</array>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>arm64</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>XSAppIconAssets</key>\n\t<string>Assets.xcassets/appicon.appiconset</string>\n\t<key>UIApplicationSceneManifest</key>\n\t<dict>\n\t\t<key>UIApplicationSupportsMultipleScenes</key>\n\t\t<false/>\n\t\t<key>UISceneConfigurations</key>\n\t\t<dict>\n\t\t\t<key>UIWindowSceneSessionRoleApplication</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>UISceneConfigurationName</key>\n\t\t\t\t\t<string>Default Configuration</string>\n\t\t\t\t\t<key>UISceneDelegateClassName</key>\n\t\t\t\t\t<string>SpiceSceneDelegate</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "samples/Spice.Scenarios/Platforms/iOS/Program.cs",
    "content": "﻿using UIKit;\nusing Spice.Scenarios;\n\nUIApplication.Main(args, null, typeof(AppDelegate));"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/ActivityIndicatorScenario.cs",
    "content": "namespace Spice.Scenarios;\n\nclass ActivityIndicatorScenario : StackLayout\n{\n\tpublic ActivityIndicatorScenario()\n\t{\n\t\tTitle = \"Activity Indicator\";\n\t\tSpacing = 20;\n\n\t\tvar activityIndicator = new ActivityIndicator\n\t\t{\n\t\t\tIsRunning = true,\n\t\t\tColor = Colors.Red\n\t\t};\n\n\t\tvar button = new Button\n\t\t{\n\t\t\tText = \"Toggle Running\",\n\t\t\tClicked = _ => activityIndicator.IsRunning = !activityIndicator.IsRunning\n\t\t};\n\n\t\tvar blueButton = new Button\n\t\t{\n\t\t\tText = \"Blue Color\",\n\t\t\tClicked = _ => activityIndicator.Color = Colors.Blue\n\t\t};\n\n\t\tvar greenButton = new Button\n\t\t{\n\t\t\tText = \"Green Color\",\n\t\t\tClicked = _ => activityIndicator.Color = Colors.Green\n\t\t};\n\n\t\tvar redButton = new Button\n\t\t{\n\t\t\tText = \"Red Color\",\n\t\t\tClicked = _ => activityIndicator.Color = Colors.Red\n\t\t};\n\n\t\tAdd(new Label { Text = \"ActivityIndicator Demo\", TextColor = Colors.White });\n\t\tAdd(activityIndicator);\n\t\tAdd(button);\n\t\tAdd(new Label { Text = \"Change Color:\", TextColor = Colors.White });\n\t\tAdd(blueButton);\n\t\tAdd(greenButton);\n\t\tAdd(redButton);\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/BorderScenario.cs",
    "content": "namespace Spice.Scenarios;\n\n/// <summary>\n/// Demonstrates the Border control with various configurations\n/// </summary>\nclass BorderScenario : StackLayout\n{\n\tpublic BorderScenario()\n\t{\n\t\tTitle = \"Border\";\n\t\t// Example 1: Simple border with text\n\t\tvar simpleBorder = new Border\n\t\t{\n\t\t\tStroke = Colors.Blue,\n\t\t\tStrokeThickness = 2.0,\n\t\t\tCornerRadius = 8.0,\n\t\t\tPadding = 10.0,\n\t\t\tContent = new Label\n\t\t\t{\n\t\t\t\tText = \"Simple Border\",\n\t\t\t\tTextColor = Colors.White\n\t\t\t},\n\t\t\tHorizontalOptions = LayoutOptions.Fill\n\t\t};\n\n\t\t// Example 2: Border with background color\n\t\tvar coloredBorder = new Border\n\t\t{\n\t\t\tStroke = Colors.Green,\n\t\t\tStrokeThickness = 3.0,\n\t\t\tCornerRadius = 15.0,\n\t\t\tPadding = 15.0,\n\t\t\tBackgroundColor = Colors.LightGreen,\n\t\t\tContent = new Label\n\t\t\t{\n\t\t\t\tText = \"Border with Background\",\n\t\t\t\tTextColor = Colors.DarkGreen\n\t\t\t},\n\t\t\tHorizontalOptions = LayoutOptions.Fill\n\t\t};\n\n\t\t// Example 3: Rounded border (high corner radius)\n\t\tvar roundedBorder = new Border\n\t\t{\n\t\t\tStroke = Colors.Purple,\n\t\t\tStrokeThickness = 2.0,\n\t\t\tCornerRadius = 25.0,\n\t\t\tPadding = 12.0,\n\t\t\tContent = new Label\n\t\t\t{\n\t\t\t\tText = \"Rounded Border\",\n\t\t\t\tTextColor = Colors.White\n\t\t\t},\n\t\t\tHorizontalOptions = LayoutOptions.Fill\n\t\t};\n\n\t\t// Example 4: Border with button inside\n\t\tvar buttonBorder = new Border\n\t\t{\n\t\t\tStroke = Colors.Orange,\n\t\t\tStrokeThickness = 2.0,\n\t\t\tCornerRadius = 10.0,\n\t\t\tPadding = 5.0,\n\t\t\tContent = new Button\n\t\t\t{\n\t\t\t\tText = \"Button in Border\",\n\t\t\t\tClicked = _ => System.Diagnostics.Debug.WriteLine(\"Button clicked!\")\n\t\t\t},\n\t\t\tHorizontalOptions = LayoutOptions.Fill\n\t\t};\n\n\t\t// Example 5: Nested content with StackLayout\n\t\tvar nestedBorder = new Border\n\t\t{\n\t\t\tStroke = Colors.Red,\n\t\t\tStrokeThickness = 2.0,\n\t\t\tCornerRadius = 12.0,\n\t\t\tPadding = 10.0,\n\t\t\tBackgroundColor = Colors.LightCoral,\n\t\t\tContent = new StackLayout\n\t\t\t{\n\t\t\t\tnew Label { Text = \"Nested Content\", TextColor = Colors.White },\n\t\t\t\tnew Label { Text = \"Multiple items inside\", TextColor = Colors.White },\n\t\t\t},\n\t\t\tHorizontalOptions = LayoutOptions.Fill\n\t\t};\n\n\t\t// Title\n\t\tAdd(new Label\n\t\t{\n\t\t\tText = \"Border Examples\",\n\t\t\tTextColor = Colors.White\n\t\t});\n\n\t\t// Add all border examples\n\t\tAdd(simpleBorder);\n\t\tAdd(coloredBorder);\n\t\tAdd(roundedBorder);\n\t\tAdd(buttonBorder);\n\t\tAdd(nestedBorder);\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/BoxViewScenario.cs",
    "content": "namespace Spice.Scenarios;\n\nclass BoxViewScenario : StackLayout\n{\n\tpublic BoxViewScenario()\n\t{\n\t\tTitle = \"Box View\";\n\t\tSpacing = 20;\n\n\t\tvar boxView = new BoxView\n\t\t{\n\t\t\tColor = Colors.Red\n\t\t};\n\n\t\tvar blueButton = new Button\n\t\t{\n\t\t\tText = \"Blue Color\",\n\t\t\tClicked = _ => boxView.Color = Colors.Blue\n\t\t};\n\n\t\tvar greenButton = new Button\n\t\t{\n\t\t\tText = \"Green Color\",\n\t\t\tClicked = _ => boxView.Color = Colors.Green\n\t\t};\n\n\t\tvar redButton = new Button\n\t\t{\n\t\t\tText = \"Red Color\",\n\t\t\tClicked = _ => boxView.Color = Colors.Red\n\t\t};\n\n\t\tvar yellowButton = new Button\n\t\t{\n\t\t\tText = \"Yellow Color\",\n\t\t\tClicked = _ => boxView.Color = Colors.Yellow\n\t\t};\n\n\t\tAdd(new Label { Text = \"BoxView Demo\", TextColor = Colors.White });\n\t\tAdd(boxView);\n\t\tAdd(new Label { Text = \"Change Color:\", TextColor = Colors.White });\n\t\tAdd(blueButton);\n\t\tAdd(greenButton);\n\t\tAdd(redButton);\n\t\tAdd(yellowButton);\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/CheckBoxScenario.cs",
    "content": "namespace Spice.Scenarios;\n\n/// <summary>\n/// Example showing CheckBox usage\n/// </summary>\nclass CheckBoxScenario : StackLayout\n{\n\tpublic CheckBoxScenario()\n\t{\n\t\tTitle = \"Check Box\";\n\t\tvar label = new Label\n\t\t{\n\t\t\tText = \"No items selected\",\n\t\t};\n\n\t\tvar checkBox1 = new CheckBox();\n\n\t\tvar label1 = new Label\n\t\t{\n\t\t\tText = \"Option 1\",\n\t\t};\n\n\t\tvar checkBox2 = new CheckBox();\n\n\t\tvar label2 = new Label\n\t\t{\n\t\t\tText = \"Option 2\",\n\t\t};\n\n\t\tvar checkBox3 = new CheckBox\n\t\t{\n\t\t\tIsChecked = true,\n\t\t};\n\n\t\tvar label3 = new Label\n\t\t{\n\t\t\tText = \"Option 3 (default checked)\",\n\t\t};\n\n\t\tcheckBox1.CheckedChanged = _ => UpdateLabel();\n\t\tcheckBox2.CheckedChanged = _ => UpdateLabel();\n\t\tcheckBox3.CheckedChanged = _ => UpdateLabel();\n\n\t\tAdd(new Image { Source = \"spice\" });\n\t\tAdd(label);\n\t\tAdd(checkBox1);\n\t\tAdd(label1);\n\t\tAdd(checkBox2);\n\t\tAdd(label2);\n\t\tAdd(checkBox3);\n\t\tAdd(label3);\n\n\t\tUpdateLabel();\n\n\t\tvoid UpdateLabel()\n\t\t{\n\t\t\tvar count = 0;\n\t\t\tif (checkBox1.IsChecked) count++;\n\t\t\tif (checkBox2.IsChecked) count++;\n\t\t\tif (checkBox3.IsChecked) count++;\n\n\t\t\tlabel.Text = count switch\n\t\t\t{\n\t\t\t\t0 => \"No items selected\",\n\t\t\t\t1 => \"1 item selected\",\n\t\t\t\t_ => $\"{count} items selected\"\n\t\t\t};\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/CollectionViewScenario.cs",
    "content": "using System.Collections.ObjectModel;\n\nnamespace Spice.Scenarios;\n\n/// <summary>\n/// Scenario demonstrating CollectionView with lambda-based item templates\n/// </summary>\nclass CollectionViewScenario : StackLayout\n{\n\tpublic CollectionViewScenario()\n\t{\n\t\tTitle = \"Collection View\";\n\t\tSpacing = 10;\n\n\t\t// Title\n\t\tAdd(new Label\n\t\t{\n\t\t\tText = \"CollectionView Demo 📋\",\n\t\t\tTextColor = Colors.Blue\n\t\t});\n\n\t\t// Create data source\n\t\tvar items = new ObservableCollection<Person>\n\t\t{\n\t\t\tnew Person { Name = \"Alice\", Age = 30, Color = Colors.Red },\n\t\t\tnew Person { Name = \"Bob\", Age = 25, Color = Colors.Green },\n\t\t\tnew Person { Name = \"Charlie\", Age = 35, Color = Colors.Blue },\n\t\t\tnew Person { Name = \"Diana\", Age = 28, Color = Colors.Orange },\n\t\t\tnew Person { Name = \"Eve\", Age = 32, Color = Colors.Purple },\n\t\t\tnew Person { Name = \"Frank\", Age = 40, Color = Colors.Brown },\n\t\t\tnew Person { Name = \"Grace\", Age = 27, Color = Colors.Pink },\n\t\t\tnew Person { Name = \"Henry\", Age = 45, Color = Colors.DarkGreen }\n\t\t};\n\n\t\t// Label to show selected item\n\t\tvar selectedLabel = new Label\n\t\t{\n\t\t\tText = \"Select an item from the list\",\n\t\t\tTextColor = Colors.Gray\n\t\t};\n\n\t\t// Create CollectionView with lambda-based item template\n\t\tvar collectionView = new CollectionView\n\t\t{\n\t\t\tItemsSource = items,\n\t\t\tItemTemplate = item =>\n\t\t\t{\n\t\t\t\tvar person = (Person)item;\n\t\t\t\treturn new Border\n\t\t\t\t{\n\t\t\t\t\tBackgroundColor = person.Color.WithAlpha(0.2f),\n\t\t\t\t\tContent = new StackLayout\n\t\t\t\t\t{\n\t\t\t\t\t\tSpacing = 5,\n\t\t\t\t\t\tChildren =\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnew Label\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tText = person.Name,\n\t\t\t\t\t\t\t\tTextColor = person.Color\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnew Label\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tText = $\"Age: {person.Age}\",\n\t\t\t\t\t\t\t\tTextColor = Colors.Gray\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\t\t\tSelectionMode = SelectionMode.Single,\n\t\t\tOrientation = Orientation.Vertical,\n\t\t\tItemSpacing = 10\n\t\t};\n\n\t\t// Handle selection changes\n\t\tcollectionView.PropertyChanged += (sender, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(CollectionView.SelectedItem) && collectionView.SelectedItem is Person selected)\n\t\t\t{\n\t\t\t\tselectedLabel.Text = $\"Selected: {selected.Name}, Age: {selected.Age}\";\n\t\t\t\tselectedLabel.TextColor = selected.Color;\n\t\t\t}\n\t\t};\n\n\t\t// Button to add new items\n\t\tint newItemCount = 0;\n\t\tvar addButton = new Button\n\t\t{\n\t\t\tText = \"Add New Person\",\n\t\t\tClicked = _ =>\n\t\t\t{\n\t\t\t\tnewItemCount++;\n\t\t\t\titems.Add(new Person\n\t\t\t\t{\n\t\t\t\t\tName = $\"Person {newItemCount}\",\n\t\t\t\t\tAge = 20 + newItemCount,\n\t\t\t\t\tColor = Colors.Teal\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\t// Button to clear selection\n\t\tvar clearButton = new Button\n\t\t{\n\t\t\tText = \"Clear Selection\",\n\t\t\tClicked = _ =>\n\t\t\t{\n\t\t\t\tcollectionView.SelectedItem = null;\n\t\t\t\tselectedLabel.Text = \"No item selected\";\n\t\t\t\tselectedLabel.TextColor = Colors.Gray;\n\t\t\t}\n\t\t};\n\n\t\t// Add controls to layout\n\t\tAdd(selectedLabel);\n\t\tAdd(new ScrollView { Children = { collectionView } });\n\t\tAdd(new StackLayout\n\t\t{\n\t\t\tOrientation = Orientation.Horizontal,\n\t\t\tSpacing = 10,\n\t\t\tChildren = { addButton, clearButton }\n\t\t});\n\t}\n}\n\nclass Person\n{\n\tpublic string Name { get; set; } = \"\";\n\tpublic int Age { get; set; }\n\tpublic Color Color { get; set; } = Colors.Black;\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/ContentViewScenario.cs",
    "content": "namespace Spice.Scenarios;\n\npublic class ContentViewScenario : Application\n{\n\tpublic ContentViewScenario()\n\t{\n\t\tTitle = \"Content View\";\n\t\tBackgroundColor = Colors.White;\n\n\t\t// Create a simple card-like ContentView\n\t\tvar card = new ContentView\n\t\t{\n\t\t\tBackgroundColor = Colors.LightGray,\n\t\t\tContent = new StackLayout\n\t\t\t{\n\t\t\t\tnew Label\n\t\t\t\t{\n\t\t\t\t\tText = \"ContentView Example\",\n\t\t\t\t\tTextColor = Colors.Black,\n\t\t\t\t},\n\t\t\t\tnew Label\n\t\t\t\t{\n\t\t\t\t\tText = \"This is a card built with ContentView\",\n\t\t\t\t\tTextColor = Colors.DarkGray,\n\t\t\t\t},\n\t\t\t}\n\t\t};\n\n\t\t// Create another ContentView with just a label\n\t\tvar simpleContent = new ContentView\n\t\t{\n\t\t\tBackgroundColor = Colors.LightBlue,\n\t\t\tContent = new Label\n\t\t\t{\n\t\t\t\tText = \"Simple ContentView\",\n\t\t\t\tTextColor = Colors.Navy,\n\t\t\t}\n\t\t};\n\n\t\t// Nested ContentView\n\t\tvar nestedContent = new ContentView\n\t\t{\n\t\t\tBackgroundColor = Colors.LightGreen,\n\t\t\tContent = new ContentView\n\t\t\t{\n\t\t\t\tBackgroundColor = Colors.LightYellow,\n\t\t\t\tContent = new Label\n\t\t\t\t{\n\t\t\t\t\tText = \"Nested ContentView\",\n\t\t\t\t\tTextColor = Colors.Black,\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tMain = new ScrollView\n\t\t{\n\t\t\tChildren =\n\t\t\t{\n\t\t\t\tnew StackLayout\n\t\t\t\t{\n\t\t\t\t\tcard,\n\t\t\t\t\tsimpleContent,\n\t\t\t\t\tnestedContent,\n\t\t\t\t\tnew Button\n\t\t\t\t\t{\n\t\t\t\t\t\tText = \"Back\",\n\t\t\t\t\t\tClicked = _ => Main = new App(),\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/DatePickerScenario.cs",
    "content": "namespace Spice.Scenarios;\n\nclass DatePickerScenario : StackLayout\n{\n\tpublic DatePickerScenario()\n\t{\n\t\tTitle = \"Date Picker\";\n\t\tSpacing = 10;\n\n\t\tAdd(new Label { Text = \"Select a date:\" });\n\t\t\n\t\tvar datePicker = new DatePicker\n\t\t{\n\t\t\tDate = DateTime.Today,\n\t\t\tMinimumDate = new DateTime(2020, 1, 1),\n\t\t\tMaximumDate = new DateTime(2030, 12, 31)\n\t\t};\n\t\tAdd(datePicker);\n\n\t\tvar selectedLabel = new Label { Text = $\"Selected: {datePicker.Date:D}\" };\n\t\tAdd(selectedLabel);\n\n\t\tdatePicker.PropertyChanged += (sender, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(datePicker.Date))\n\t\t\t{\n\t\t\t\tselectedLabel.Text = $\"Selected: {datePicker.Date:D}\";\n\t\t\t}\n\t\t};\n\n\t\tAdd(new Label { Text = \"\\nDatePicker with custom date:\" });\n\t\t\n\t\t// TextColor is supported on Android only; iOS compact style uses system theme colors\n\t\tvar customDatePicker = new DatePicker\n\t\t{\n\t\t\tDate = new DateTime(2025, 12, 25),\n\t\t\tTextColor = Colors.Blue\n\t\t};\n\t\tAdd(customDatePicker);\n\n\t\tvar customLabel = new Label { Text = $\"Christmas 2025: {customDatePicker.Date:D}\" };\n\t\tAdd(customLabel);\n\n\t\tcustomDatePicker.PropertyChanged += (sender, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(customDatePicker.Date))\n\t\t\t{\n\t\t\t\tcustomLabel.Text = $\"Selected: {customDatePicker.Date:D}\";\n\t\t\t}\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/EditorScenario.cs",
    "content": "namespace Spice.Scenarios;\n\nclass EditorScenario : StackLayout\n{\n\tpublic EditorScenario()\n\t{\n\t\tTitle = \"Editor\";\n\t\tSpacing = 10;\n\n\t\tAdd(new Label { Text = \"Editor Control\" });\n\t\tAdd(new Editor \n\t\t{ \n\t\t\tText = \"This is a multi-line text editor.\\nYou can type multiple lines here.\",\n\t\t\tHeightRequest = 150\n\t\t});\n\t\t\n\t\tAdd(new Label { Text = \"With Placeholder (Android only)\" });\n\t\tAdd(new Editor \n\t\t{ \n\t\t\tPlaceholder = \"Enter your comments here...\",\n\t\t\tHeightRequest = 100\n\t\t});\n\t\t\n\t\tAdd(new Label { Text = \"Styled Editor\" });\n\t\tAdd(new Editor \n\t\t{ \n\t\t\tText = \"Colored text\",\n\t\t\tTextColor = Colors.Blue,\n\t\t\tPlaceholder = \"Type something...\",\n\t\t\tPlaceholderColor = Colors.Gray,\n\t\t\tHeightRequest = 100\n\t\t});\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/EntryScenario.cs",
    "content": "﻿namespace Spice.Scenarios;\n\nclass EntryScenario : StackLayout\n{\n\tpublic EntryScenario()\n\t{\n\t\tTitle = \"Entry\";\n\t\tSpacing = 5;\n\n\t\tAdd(new Entry { Text = \"jonathan.peppers@gmail.com\" });\n\t\tAdd(new Entry { IsPassword = true });\n\t\tAdd(new Button { Text = \"Login\" });\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/GhostButtonScenario.cs",
    "content": "﻿namespace Spice.Scenarios;\n\n/// <summary>\n/// See GhostButton for an example of platform-specific logic\n/// </summary>\nclass GhostButtonScenario : StackLayout\n{\n\tpublic GhostButtonScenario()\n\t{\n\t\tTitle = \"Ghost Button\";\n\t\tint count = 0;\n\n\t\tvar label = new Label\n\t\t{\n\t\t\tText = \"Pretty spooky! 👻\",\n\t\t};\n\n\t\tvar button = new GhostButton\n\t\t{\n\t\t\tText = \"Ghost button\",\n\t\t\tClicked = _ => label.Text = $\"Times: {++count}\"\n\t\t};\n\n\t\tAdd(new Image { Source = \"spice\" });\n\t\tAdd(label);\n\t\tAdd(button);\n\t\tAdd(new Button { Text = \"Regular Button\" });\n\t}\n\n\tclass GhostButton : Button\n\t{\n\t\tpublic GhostButton() => NativeView.Alpha = 0.5f;\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/HelloWorldScenario.cs",
    "content": "﻿namespace Spice.Scenarios;\n\n/// <summary>\n/// Most basic scenario\n/// NOTE: my color choices are suspect! 🌈🤢\n/// </summary>\nclass HelloWorldScenario : StackLayout\n{\n\tpublic HelloWorldScenario()\n\t{\n\t\tTitle = \"Hello World\";\n\t\tint count = 0;\n\n\t\tvar label = new Label\n\t\t{\n\t\t\tText = \"Hello, Spice 🌶\",\n\t\t\tTextColor = Colors.Red\n\t\t};\n\n\t\tvar button = new Button\n\t\t{\n\t\t\tText = \"Click Me\",\n\t\t\tClicked = _ => label.Text = $\"Times: {++count}\"\n\t\t};\n\n\t\tAdd(new Image { Source = \"spice\" });\n\t\tAdd(label);\n\t\tAdd(button);\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/ImageButtonScenario.cs",
    "content": "namespace Spice.Scenarios;\n\n/// <summary>\n/// ImageButton scenario demonstrating clickable image buttons\n/// </summary>\nclass ImageButtonScenario : StackLayout\n{\n\tpublic ImageButtonScenario()\n\t{\n\t\tTitle = \"Image Button\";\n\t\tint count = 0;\n\n\t\tvar label = new Label\n\t\t{\n\t\t\tText = \"Click the image button below!\",\n\t\t\tTextColor = Colors.Blue\n\t\t};\n\n\t\tvar imageButton = new ImageButton\n\t\t{\n\t\t\tSource = \"spice\",\n\t\t\tClicked = _ => label.Text = $\"Clicked {++count} time(s)!\"\n\t\t};\n\n\t\tAdd(label);\n\t\tAdd(imageButton);\n\n\t\t// Add another image button with different source\n\t\tvar secondLabel = new Label\n\t\t{\n\t\t\tText = \"Or click this one:\",\n\t\t\tTextColor = Colors.Green\n\t\t};\n\n\t\tvar secondImageButton = new ImageButton\n\t\t{\n\t\t\tSource = \"dotnet_bot\",\n\t\t\tClicked = _ => secondLabel.Text = \"You clicked the bot!\"\n\t\t};\n\n\t\tAdd(secondLabel);\n\t\tAdd(secondImageButton);\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/MarginScenario.cs",
    "content": "namespace Spice.Scenarios;\n\nclass MarginScenario : StackLayout\n{\n\tpublic MarginScenario()\n\t{\n\t\tTitle = \"Margin\";\n\t\tSpacing = 20;\n\n\t\tAdd(new Label { Text = \"Margin Demo\", TextColor = Colors.White });\n\n\t\t// No margin\n\t\tAdd(new Label\n\t\t{\n\t\t\tText = \"No Margin\",\n\t\t\tBackgroundColor = Colors.Blue,\n\t\t\tTextColor = Colors.White\n\t\t});\n\n\t\t// Uniform margin\n\t\tAdd(new Label\n\t\t{\n\t\t\tText = \"Uniform Margin = 20\",\n\t\t\tBackgroundColor = Colors.Green,\n\t\t\tTextColor = Colors.White,\n\t\t\tMargin = 20\n\t\t});\n\n\t\t// Horizontal/Vertical margin\n\t\tAdd(new Label\n\t\t{\n\t\t\tText = \"Horizontal 10, Vertical 30\",\n\t\t\tBackgroundColor = Colors.Orange,\n\t\t\tTextColor = Colors.White,\n\t\t\tMargin = new Thickness(10, 30)\n\t\t});\n\n\t\t// Individual margins\n\t\tAdd(new Label\n\t\t{\n\t\t\tText = \"Individual: L=0, T=10, R=40, B=20\",\n\t\t\tBackgroundColor = Colors.Purple,\n\t\t\tTextColor = Colors.White,\n\t\t\tMargin = new Thickness(0, 10, 40, 20)\n\t\t});\n\n\t\t// Button with margin\n\t\tAdd(new Button\n\t\t{\n\t\t\tText = \"Button with Margin = 15\",\n\t\t\tMargin = 15\n\t\t});\n\n\t\t// BoxView with margin\n\t\tAdd(new BoxView\n\t\t{\n\t\t\tColor = Colors.Red,\n\t\t\tMargin = new Thickness(30, 10, 30, 10)\n\t\t});\n\n\t\tAdd(new Label\n\t\t{\n\t\t\tText = \"BoxView above has Margin = 30,10,30,10\",\n\t\t\tTextColor = Colors.White\n\t\t});\n\n\t\t// Border with margin and padding\n\t\tAdd(new Border\n\t\t{\n\t\t\tStroke = Colors.White,\n\t\t\tStrokeThickness = 2,\n\t\t\tCornerRadius = 10,\n\t\t\tPadding = 10,\n\t\t\tMargin = 20,\n\t\t\tContent = new Label\n\t\t\t{\n\t\t\t\tText = \"Border with Padding=10, Margin=20\",\n\t\t\t\tTextColor = Colors.White\n\t\t\t}\n\t\t});\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/PickerScenario.cs",
    "content": "using System.Collections.ObjectModel;\n\nnamespace Spice.Scenarios;\n\nclass PickerScenario : StackLayout\n{\n\tpublic PickerScenario()\n\t{\n\t\tTitle = \"Picker\";\n\t\tSpacing = 10;\n\t\tBackgroundColor = Colors.White;\n\n\t\tAdd(new Label\n\t\t{\n\t\t\tText = \"Select your favorite color:\",\n\t\t\tTextColor = Colors.Black\n\t\t});\n\n\t\tvar picker = new Picker\n\t\t{\n\t\t\tTitle = \"Choose a color\",\n\t\t\tItems = new ObservableCollection<string>\n\t\t\t{\n\t\t\t\t\"Red\",\n\t\t\t\t\"Green\",\n\t\t\t\t\"Blue\",\n\t\t\t\t\"Yellow\",\n\t\t\t\t\"Orange\",\n\t\t\t\t\"Purple\",\n\t\t\t\t\"Pink\",\n\t\t\t\t\"Cyan\"\n\t\t\t}\n\t\t};\n\n\t\tvar resultLabel = new Label\n\t\t{\n\t\t\tText = \"No selection\",\n\t\t\tTextColor = Colors.Gray\n\t\t};\n\n\t\tpicker.PropertyChanged += (sender, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(picker.SelectedIndex))\n\t\t\t{\n\t\t\t\tif (picker.SelectedItem != null)\n\t\t\t\t{\n\t\t\t\t\tresultLabel.Text = $\"You selected: {picker.SelectedItem}\";\n\t\t\t\t\tresultLabel.TextColor = picker.SelectedItem switch\n\t\t\t\t\t{\n\t\t\t\t\t\t\"Red\" => Colors.Red,\n\t\t\t\t\t\t\"Green\" => Colors.Green,\n\t\t\t\t\t\t\"Blue\" => Colors.Blue,\n\t\t\t\t\t\t\"Yellow\" => Color.FromRgb(200, 200, 0),\n\t\t\t\t\t\t\"Orange\" => Colors.Orange,\n\t\t\t\t\t\t\"Purple\" => Colors.Purple,\n\t\t\t\t\t\t\"Pink\" => Colors.Pink,\n\t\t\t\t\t\t\"Cyan\" => Colors.Cyan,\n\t\t\t\t\t\t_ => Colors.Black\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tresultLabel.Text = \"No selection\";\n\t\t\t\t\tresultLabel.TextColor = Colors.Gray;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tAdd(picker);\n\t\tAdd(resultLabel);\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/ProgressBarScenario.cs",
    "content": "namespace Spice.Scenarios;\n\n/// <summary>\n/// Demonstrates the ProgressBar control with various progress values\n/// </summary>\nclass ProgressBarScenario : StackLayout\n{\n\tconst double ProgressIncrement = 0.1; // 10% increment per click\n\tProgressBar _progressBar;\n\tLabel _progressLabel;\n\n\tpublic ProgressBarScenario()\n\t{\n\t\tTitle = \"Progress Bar\";\n\t\t_progressLabel = new Label\n\t\t{\n\t\t\tText = \"Progress: 0%\",\n\t\t\tTextColor = Colors.White\n\t\t};\n\n\t\t_progressBar = new ProgressBar\n\t\t{\n\t\t\tProgress = 0.0,\n\t\t\tHorizontalOptions = LayoutOptions.Fill\n\t\t};\n\n\t\tvar incrementButton = new Button\n\t\t{\n\t\t\tText = \"Increment Progress (+10%)\",\n\t\t\tClicked = _ => IncrementProgress()\n\t\t};\n\n\t\tvar resetButton = new Button\n\t\t{\n\t\t\tText = \"Reset Progress\",\n\t\t\tClicked = _ => SetProgress(0.0)\n\t\t};\n\n\t\tvar setHalfButton = new Button\n\t\t{\n\t\t\tText = \"Set to 50%\",\n\t\t\tClicked = _ => SetProgress(0.5)\n\t\t};\n\n\t\tvar setCompleteButton = new Button\n\t\t{\n\t\t\tText = \"Set to 100%\",\n\t\t\tClicked = _ => SetProgress(1.0)\n\t\t};\n\n\t\tAdd(_progressLabel);\n\t\tAdd(_progressBar);\n\t\tAdd(incrementButton);\n\t\tAdd(setHalfButton);\n\t\tAdd(setCompleteButton);\n\t\tAdd(resetButton);\n\t}\n\n\tvoid IncrementProgress()\n\t{\n\t\t// ProgressBar.Progress property automatically clamps to [0.0, 1.0]\n\t\tSetProgress(_progressBar.Progress + ProgressIncrement);\n\t}\n\n\tvoid SetProgress(double value)\n\t{\n\t\t_progressBar.Progress = value;\n\t\t// Read back the clamped value from the property\n\t\t_progressLabel.Text = $\"Progress: {(_progressBar.Progress * 100):F0}%\";\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/RadioButtonScenario.cs",
    "content": "namespace Spice.Scenarios;\n\n/// <summary>\n/// Example showing RadioButton usage\n/// </summary>\nclass RadioButtonScenario : StackLayout\n{\n\tpublic RadioButtonScenario()\n\t{\n\t\tTitle = \"Radio Button\";\n\t\tvar label = new Label\n\t\t{\n\t\t\tText = \"No option selected\",\n\t\t};\n\n\t\tvar radioButton1 = new RadioButton\n\t\t{\n\t\t\tContent = \"Option 1\",\n\t\t\tGroupName = \"Options\"\n\t\t};\n\n\t\tvar radioButton2 = new RadioButton\n\t\t{\n\t\t\tContent = \"Option 2\",\n\t\t\tGroupName = \"Options\"\n\t\t};\n\n\t\tvar radioButton3 = new RadioButton\n\t\t{\n\t\t\tContent = \"Option 3 (default checked)\",\n\t\t\tGroupName = \"Options\",\n\t\t\tIsChecked = true\n\t\t};\n\n\t\tradioButton1.CheckedChanged = rb => UpdateLabel(rb, \"Option 1\");\n\t\tradioButton2.CheckedChanged = rb => UpdateLabel(rb, \"Option 2\");\n\t\tradioButton3.CheckedChanged = rb => UpdateLabel(rb, \"Option 3\");\n\n\t\tAdd(new Image { Source = \"spice\" });\n\t\tAdd(label);\n\t\tAdd(radioButton1);\n\t\tAdd(radioButton2);\n\t\tAdd(radioButton3);\n\n\t\tUpdateLabel(radioButton3, \"Option 3\");\n\n\t\tvoid UpdateLabel(RadioButton rb, string optionName)\n\t\t{\n\t\t\tif (rb.IsChecked)\n\t\t\t{\n\t\t\t\tlabel.Text = $\"{optionName} is selected\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tlabel.Text = $\"{optionName} was unchecked\";\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/RefreshViewScenario.cs",
    "content": "namespace Spice.Scenarios;\n\n/// <summary>\n/// Scenario demonstrating RefreshView with pull-to-refresh functionality\n/// </summary>\nclass RefreshViewScenario : StackLayout\n{\n\tint _refreshCount = 0;\n\n\tpublic RefreshViewScenario()\n\t{\n\t\tTitle = \"Refresh View\";\n\t\tSpacing = 10;\n\n\t\tvar label = new Label\n\t\t{\n\t\t\tText = \"Pull down to refresh! 🔄\",\n\t\t\tTextColor = Colors.White\n\t\t};\n\n\t\tvar countLabel = new Label\n\t\t{\n\t\t\tText = \"Refresh count: 0\",\n\t\t\tTextColor = Colors.White\n\t\t};\n\n\t\tvar scrollView = new ScrollView();\n\t\tvar stackLayout = new StackLayout { Spacing = 10 };\n\n\t\tstackLayout.Add(new Label\n\t\t{\n\t\t\tText = \"RefreshView Demo\",\n\t\t\tTextColor = Colors.Blue\n\t\t});\n\n\t\t// Add items to demonstrate scrolling\n\t\tfor (int i = 1; i <= 20; i++)\n\t\t{\n\t\t\tstackLayout.Add(new Label\n\t\t\t{\n\t\t\t\tText = $\"Item {i}\"\n\t\t\t});\n\t\t}\n\n\t\tscrollView.Add(stackLayout);\n\n\t\tvar refreshView = new RefreshView\n\t\t{\n\t\t\tContent = scrollView,\n\t\t\tRefreshColor = Colors.Blue,\n\t\t\tCommand = () =>\n\t\t\t{\n\t\t\t\t// Increment refresh counter\n\t\t\t\t_refreshCount++;\n\t\t\t\tcountLabel.Text = $\"Refresh count: {_refreshCount}\";\n\n\t\t\t\t// In a real app, you would:\n\t\t\t\t// 1. Fetch new data from a server\n\t\t\t\t// 2. Update your view models/data\n\t\t\t\t// 3. Set IsRefreshing = false when done\n\t\t\t\t// \n\t\t\t\t// For this demo, the \"Trigger Refresh Manually\" button below\n\t\t\t\t// shows how to manually control the refresh state\n\t\t\t}\n\t\t};\n\n\t\tvar manualRefreshButton = new Button\n\t\t{\n\t\t\tText = \"Trigger Refresh Manually\",\n\t\t\tClicked = _ =>\n\t\t\t{\n\t\t\t\t// Start refreshing\n\t\t\t\trefreshView.IsRefreshing = true;\n\t\t\t\t\n\t\t\t\t// Execute the refresh command\n\t\t\t\trefreshView.Command?.Invoke();\n\t\t\t\t\n\t\t\t\t// In a real app, you would stop refreshing after async work completes\n\t\t\t\t// For this simple demo, we'll stop it immediately\n\t\t\t\trefreshView.IsRefreshing = false;\n\t\t\t}\n\t\t};\n\n\t\tvar colorButton = new Button\n\t\t{\n\t\t\tText = \"Change Refresh Color\",\n\t\t\tClicked = _ =>\n\t\t\t{\n\t\t\t\t// Cycle through colors\n\t\t\t\tif (refreshView.RefreshColor == Colors.Blue)\n\t\t\t\t\trefreshView.RefreshColor = Colors.Red;\n\t\t\t\telse if (refreshView.RefreshColor == Colors.Red)\n\t\t\t\t\trefreshView.RefreshColor = Colors.Green;\n\t\t\t\telse\n\t\t\t\t\trefreshView.RefreshColor = Colors.Blue;\n\t\t\t}\n\t\t};\n\n\t\tAdd(label);\n\t\tAdd(countLabel);\n\t\tAdd(manualRefreshButton);\n\t\tAdd(colorButton);\n\t\tAdd(refreshView);\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/ScrollViewScenario.cs",
    "content": "namespace Spice.Scenarios;\n\n/// <summary>\n/// Scenario demonstrating ScrollView with a long list of items\n/// </summary>\nclass ScrollViewScenario : ScrollView\n{\n\tpublic ScrollViewScenario()\n\t{\n\t\tTitle = \"Scroll View\";\n\t\tvar stackLayout = new StackLayout { Spacing = 10 };\n\n\t\t// Add a title\n\t\tstackLayout.Add(new Label\n\t\t{\n\t\t\tText = \"ScrollView Demo 📜\",\n\t\t\tTextColor = Colors.Blue\n\t\t});\n\n\t\t// Add many items to demonstrate scrolling\n\t\tfor (int i = 1; i <= 30; i++)\n\t\t{\n\t\t\tstackLayout.Add(new Label\n\t\t\t{\n\t\t\t\tText = $\"Item {i}\"\n\t\t\t});\n\t\t}\n\n\t\tAdd(stackLayout);\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/SearchBarScenario.cs",
    "content": "namespace Spice.Scenarios;\n\nclass SearchBarScenario : StackLayout\n{\n\tpublic SearchBarScenario()\n\t{\n\t\tTitle = \"Search Bar\";\n\t\tSpacing = 5;\n\n\t\tvar searchLabel = new Label { Text = \"Search for something...\" };\n\t\tvar textChangedLabel = new Label { Text = \"Type to see text changes...\" };\n\n\t\tAdd(new SearchBar\n\t\t{\n\t\t\tPlaceholder = \"Search\",\n\t\t\tPlaceholderColor = Colors.Gray,\n\t\t\tTextColor = Colors.Blue,\n\t\t\tSearchButtonPressed = s => searchLabel.Text = $\"Searched: {s.Text}\",\n\t\t\tTextChanged = s => textChangedLabel.Text = $\"Current: {s.Text}\",\n\t\t});\n\t\tAdd(searchLabel);\n\t\tAdd(textChangedLabel);\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/SliderScenario.cs",
    "content": "namespace Spice.Scenarios;\n\nclass SliderScenario : StackLayout\n{\n\tpublic SliderScenario()\n\t{\n\t\tTitle = \"Slider\";\n\t\tSpacing = 10;\n\n\t\tvar valueLabel = new Label { Text = \"Value: 50\" };\n\t\tvar slider = new Slider\n\t\t{\n\t\t\tMinimum = 0,\n\t\t\tMaximum = 100,\n\t\t\tValue = 50\n\t\t};\n\t\tslider.ValueChanged = s =>\n\t\t{\n\t\t\tvalueLabel.Text = $\"Value: {s.Value:F0}\";\n\t\t};\n\n\t\tAdd(new Label { Text = \"Slider Demo\" });\n\t\tAdd(slider);\n\t\tAdd(valueLabel);\n\n\t\t// Second slider for volume style (0-10)\n\t\tvar volumeLabel = new Label { Text = \"Volume: 5\" };\n\t\tvar volumeSlider = new Slider\n\t\t{\n\t\t\tMinimum = 0,\n\t\t\tMaximum = 10,\n\t\t\tValue = 5\n\t\t};\n\t\tvolumeSlider.ValueChanged = s =>\n\t\t{\n\t\t\tvolumeLabel.Text = $\"Volume: {s.Value:F0}\";\n\t\t};\n\n\t\tAdd(new Label { Text = \"Volume Control\" });\n\t\tAdd(volumeSlider);\n\t\tAdd(volumeLabel);\n\n\t\t// Third slider for percentage (0-100)\n\t\tvar percentLabel = new Label { Text = \"Percent: 50%\" };\n\t\tvar percentSlider = new Slider\n\t\t{\n\t\t\tMinimum = 0,\n\t\t\tMaximum = 100,\n\t\t\tValue = 50\n\t\t};\n\t\tpercentSlider.ValueChanged = s =>\n\t\t{\n\t\t\tpercentLabel.Text = $\"Percent: {s.Value:F0}%\";\n\t\t};\n\n\t\tAdd(new Label { Text = \"Percentage\" });\n\t\tAdd(percentSlider);\n\t\tAdd(percentLabel);\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/SwipeViewScenario.cs",
    "content": "namespace Spice.Scenarios;\n\n/// <summary>\n/// Demonstrates SwipeView with swipe gestures to reveal action items\n/// </summary>\npublic class SwipeViewScenario : ContentView\n{\n\tpublic SwipeViewScenario()\n\t{\n\t\tTitle = \"Swipe View\";\n\t\tContent = new ScrollView\n\t\t{\n\t\t\tnew StackLayout\n\t\t\t{\n\t\t\t\tnew Label\n\t\t\t\t{\n\t\t\t\t\tText = \"SwipeView Demo\",\n\t\t\t\t\tHorizontalOptions = LayoutOptions.Center\n\t\t\t\t},\n\t\t\t\tnew Label\n\t\t\t\t{\n\t\t\t\t\tText = \"Swipe items left or right to see actions\",\n\t\t\t\t\tHorizontalOptions = LayoutOptions.Center\n\t\t\t\t},\n\n\t\t\t\t// Basic swipe view with right items (swipe left to reveal)\n\t\t\t\tCreateSwipeViewItem(\"Email from Alice\", \"Meeting tomorrow at 10am\"),\n\n\t\t\t\t// Swipe view with left items (swipe right to reveal)\n\t\t\t\tCreateSwipeViewWithLeftItems(\"Email from Bob\", \"Project update attached\"),\n\n\t\t\t\t// Swipe view with both left and right items\n\t\t\t\tCreateSwipeViewWithBothItems(\"Email from Carol\", \"Quarterly report ready\"),\n\n\t\t\t\t// Additional examples\n\t\t\t\tCreateSwipeViewItem(\"Email from David\", \"Code review needed\"),\n\t\t\t\tCreateSwipeViewItem(\"Email from Eve\", \"New feature proposal\"),\n\t\t\t}\n\t\t};\n\t}\n\n\tSwipeView CreateSwipeViewItem(string title, string subtitle)\n\t{\n\t\tvar swipeView = new SwipeView\n\t\t{\n\t\t\tRightItems = new SwipeItems\n\t\t\t{\n\t\t\t\tMode = SwipeMode.Reveal,\n\t\t\t\tSwipeBehaviorOnInvoked = SwipeBehaviorOnInvoked.Close\n\t\t\t},\n\t\t\tContent = new Border\n\t\t\t{\n\t\t\t\tBackgroundColor = Colors.White,\n\t\t\t\tContent = new StackLayout\n\t\t\t\t{\n\t\t\t\t\tnew Label { Text = title },\n\t\t\t\t\tnew Label { Text = subtitle }\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Add swipe items\n\t\tswipeView.RightItems.Items.Add(new SwipeItem\n\t\t{\n\t\t\tText = \"Delete\",\n\t\t\tBackgroundColor = Colors.Red,\n\t\t\tInvoked = item =>\n\t\t\t{\n\t\t\t\t// Handle delete action\n\t\t\t}\n\t\t});\n\n\t\tswipeView.RightItems.Items.Add(new SwipeItem\n\t\t{\n\t\t\tText = \"Archive\",\n\t\t\tBackgroundColor = Colors.Orange,\n\t\t\tInvoked = item =>\n\t\t\t{\n\t\t\t\t// Handle archive action\n\t\t\t}\n\t\t});\n\n\t\treturn swipeView;\n\t}\n\n\tSwipeView CreateSwipeViewWithLeftItems(string title, string subtitle)\n\t{\n\t\tvar swipeView = new SwipeView\n\t\t{\n\t\t\tLeftItems = new SwipeItems\n\t\t\t{\n\t\t\t\tMode = SwipeMode.Reveal,\n\t\t\t\tSwipeBehaviorOnInvoked = SwipeBehaviorOnInvoked.Close\n\t\t\t},\n\t\t\tContent = new Border\n\t\t\t{\n\t\t\t\tBackgroundColor = Colors.White,\n\t\t\t\tContent = new StackLayout\n\t\t\t\t{\n\t\t\t\t\tnew Label { Text = title },\n\t\t\t\t\tnew Label { Text = subtitle }\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Add left swipe items\n\t\tswipeView.LeftItems.Items.Add(new SwipeItem\n\t\t{\n\t\t\tText = \"Mark Read\",\n\t\t\tBackgroundColor = Colors.Blue,\n\t\t\tInvoked = item =>\n\t\t\t{\n\t\t\t\t// Handle mark as read\n\t\t\t}\n\t\t});\n\n\t\tswipeView.LeftItems.Items.Add(new SwipeItem\n\t\t{\n\t\t\tText = \"Flag\",\n\t\t\tBackgroundColor = Colors.Green,\n\t\t\tInvoked = item =>\n\t\t\t{\n\t\t\t\t// Handle flag action\n\t\t\t}\n\t\t});\n\n\t\treturn swipeView;\n\t}\n\n\tSwipeView CreateSwipeViewWithBothItems(string title, string subtitle)\n\t{\n\t\tvar swipeView = new SwipeView\n\t\t{\n\t\t\tLeftItems = new SwipeItems\n\t\t\t{\n\t\t\t\tMode = SwipeMode.Reveal,\n\t\t\t\tSwipeBehaviorOnInvoked = SwipeBehaviorOnInvoked.Close\n\t\t\t},\n\t\t\tRightItems = new SwipeItems\n\t\t\t{\n\t\t\t\tMode = SwipeMode.Reveal,\n\t\t\t\tSwipeBehaviorOnInvoked = SwipeBehaviorOnInvoked.Close\n\t\t\t},\n\t\t\tContent = new Border\n\t\t\t{\n\t\t\t\tBackgroundColor = Colors.White,\n\t\t\t\tContent = new StackLayout\n\t\t\t\t{\n\t\t\t\t\tnew Label { Text = title },\n\t\t\t\t\tnew Label { Text = subtitle }\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Left items\n\t\tswipeView.LeftItems.Items.Add(new SwipeItem\n\t\t{\n\t\t\tText = \"Reply\",\n\t\t\tBackgroundColor = Colors.Blue,\n\t\t\tInvoked = item =>\n\t\t\t{\n\t\t\t\t// Handle reply\n\t\t\t}\n\t\t});\n\n\t\t// Right items\n\t\tswipeView.RightItems.Items.Add(new SwipeItem\n\t\t{\n\t\t\tText = \"Delete\",\n\t\t\tBackgroundColor = Colors.Red,\n\t\t\tInvoked = item =>\n\t\t\t{\n\t\t\t\t// Handle delete\n\t\t\t}\n\t\t});\n\n\t\treturn swipeView;\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/SwitchScenario.cs",
    "content": "namespace Spice.Scenarios;\n\n/// <summary>\n/// Demonstrates Switch control usage\n/// </summary>\nclass SwitchScenario : StackLayout\n{\n\tpublic SwitchScenario()\n\t{\n\t\tTitle = \"Switch\";\n\t\tvar label = new Label\n\t\t{\n\t\t\tText = \"Switch is OFF\",\n\t\t\tTextColor = Colors.Red\n\t\t};\n\n\t\tvar switchControl = new Switch\n\t\t{\n\t\t\tIsOn = false,\n\t\t\tToggled = s =>\n\t\t\t{\n\t\t\t\tlabel.Text = s.IsOn ? \"Switch is ON\" : \"Switch is OFF\";\n\t\t\t\tlabel.TextColor = s.IsOn ? Colors.Green : Colors.Red;\n\t\t\t}\n\t\t};\n\n\t\tvar switchControl2 = new Switch\n\t\t{\n\t\t\tIsOn = true\n\t\t};\n\n\t\tvar label2 = new Label\n\t\t{\n\t\t\tText = \"Second switch (starts ON)\"\n\t\t};\n\n\t\tAdd(new Label { Text = \"Toggle Switch Demo 🌶\" });\n\t\tAdd(switchControl);\n\t\tAdd(label);\n\t\tAdd(label2);\n\t\tAdd(switchControl2);\n\t\tAdd(new Button\n\t\t{\n\t\t\tText = \"Toggle First Switch Programmatically\",\n\t\t\tClicked = _ => switchControl.IsOn = !switchControl.IsOn\n\t\t});\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/ThemeScenario.cs",
    "content": "﻿namespace Spice.Scenarios;\n\n/// <summary>\n/// Demonstrates theme switching (light/dark) and explicit per-view overrides.\n/// </summary>\nclass ThemeScenario : StackLayout\n{\n\tpublic ThemeScenario()\n\t{\n\t\tTitle = \"Theme\";\n\n\t\tvar label = new Label { Text = \"Hello, Spice 🌶\" };\n\t\tvar counter = new Label { Text = \"Times: 0\" };\n\t\tint count = 0;\n\t\tvar button = new Button\n\t\t{\n\t\t\tText = \"Tap me\",\n\t\t\tClicked = _ => counter.Text = $\"Times: {++count}\",\n\t\t};\n\t\tvar overrideLabel = new Label\n\t\t{\n\t\t\tText = \"I'm always red\",\n\t\t\tTextColor = Colors.Red,\n\t\t};\n\t\tvar darkModeSwitch = new Switch\n\t\t{\n\t\t\tToggled = sw =>\n\t\t\t{\n\t\t\t\tif (Navigation is { } nav)\n\t\t\t\t{\n\t\t\t\t\t// Walk up to find the Application — simplest: just set on the first Application ancestor\n\t\t\t\t\t// For demo purposes, swap the theme on the global app reference\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\n\t\tAdd(label);\n\t\tAdd(counter);\n\t\tAdd(button);\n\t\tAdd(new Label { Text = \"Dark Mode:\" });\n\t\tAdd(darkModeSwitch);\n\t\tAdd(overrideLabel);\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/TimePickerScenario.cs",
    "content": "namespace Spice.Scenarios;\n\nclass TimePickerScenario : StackLayout\n{\n\tpublic TimePickerScenario()\n\t{\n\t\tTitle = \"Time Picker\";\n\t\tSpacing = 10;\n\n\t\tAdd(new Label\n\t\t{\n\t\t\tText = \"Select a time:\",\n\t\t});\n\n\t\tvar timePicker = new TimePicker\n\t\t{\n\t\t\tTime = new TimeOnly(9, 30)\n\t\t};\n\n\t\tAdd(timePicker);\n\n\t\tvar resultLabel = new Label\n\t\t{\n\t\t\tText = GetTimeDisplayText(timePicker.Time),\n\t\t};\n\n\t\tAdd(resultLabel);\n\n\t\t// Update label when time changes\n\t\ttimePicker.PropertyChanged += (sender, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(timePicker.Time))\n\t\t\t{\n\t\t\t\tresultLabel.Text = GetTimeDisplayText(timePicker.Time);\n\t\t\t}\n\t\t};\n\t}\n\n\tstatic string GetTimeDisplayText(TimeOnly time) =>\n\t\t$\"Selected: {time:hh\\\\:mm tt}\";\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Scenarios/WebViewScenario.cs",
    "content": "﻿namespace Spice.Scenarios;\n\n/// <summary>\n/// Scenario navigating a WebView\n/// </summary>\nclass WebViewScenario : WebView\n{\n\tpublic WebViewScenario()\n\t{\n\t\tTitle = \"Web View\";\n\t\tSource = \"https://www.google.com\";\n\t}\n}\n"
  },
  {
    "path": "samples/Spice.Scenarios/Spice.Scenarios.csproj",
    "content": "﻿<Project>\n\n    <Import Project=\"../../src/Spice/MSBuild/Spice.props\" />\n    <Import Sdk=\"Microsoft.NET.Sdk\" Project=\"Sdk.props\" />\n\n    <PropertyGroup>\n        <TargetFrameworks>net10.0-android;net10.0-ios</TargetFrameworks>\n        <OutputType>Exe</OutputType>\n        <RootNamespace>Spice.Scenarios</RootNamespace>\n        <UseMauiAssets>true</UseMauiAssets>\n        <SingleProject>true</SingleProject>\n        <ImplicitUsings>enable</ImplicitUsings>\n        <Nullable>enable</Nullable>\n        <ApplicationTitle>Hello Spice</ApplicationTitle>\n        <ApplicationId>com.companyname.spice.scenarios</ApplicationId>\n        <ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>\n        <ApplicationVersion>1</ApplicationVersion>\n        <SupportedOSPlatformVersion Condition=\"$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'\">16.0</SupportedOSPlatformVersion>\n        <SupportedOSPlatformVersion Condition=\"$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'\">21.0</SupportedOSPlatformVersion>\n        <RuntimeIdentifier Condition=\"'$(GITHUB_ACTIONS)' == 'true' and $([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'\">android-arm64</RuntimeIdentifier>\n        <AndroidPackageFormat>apk</AndroidPackageFormat>\n    </PropertyGroup>\n\n    <ItemGroup>\n        <!-- App Icon -->\n        <MauiIcon Include=\"Resources\\AppIcon\\appicon.svg\" ForegroundFile=\"Resources\\AppIcon\\appiconfg.svg\" Color=\"#512BD4\" />\n\n        <!-- Splash Screen -->\n        <MauiSplashScreen Include=\"Resources\\Splash\\splash.svg\" Color=\"#512BD4\" BaseSize=\"128,128\" />\n\n        <!-- Images -->\n        <MauiImage Include=\"Resources\\Images\\*\" />\n        <MauiImage Update=\"Resources\\Images\\spice.svg\" BaseSize=\"168,208\" />\n\n        <!-- Custom Fonts -->\n        <MauiFont Include=\"Resources\\Fonts\\*\" />\n\n        <!-- Raw Assets (also remove the \"Resources\\Raw\" prefix) -->\n        <MauiAsset Include=\"Resources\\Raw\\**\" LogicalName=\"%(RecursiveDir)%(Filename)%(Extension)\" />\n    </ItemGroup>\n\n    <ItemGroup>\n        <ProjectReference Include=\"..\\..\\src\\Spice\\Spice.csproj\" />\n        <PackageReference Include=\"Microsoft.Maui.Resizetizer\" />\n    </ItemGroup>\n\n    <Import Sdk=\"Microsoft.NET.Sdk\" Project=\"Sdk.targets\" />\n    <Import Project=\"../../src/Spice/MSBuild/Spice.targets\" />\n</Project>\n"
  },
  {
    "path": "samples/samples.slnx",
    "content": "<Solution>\n  <Project Path=\"Spice.BlazorSample/Spice.BlazorSample.csproj\">\n    <Deploy />\n  </Project>\n  <Project Path=\"Spice.Scenarios/Spice.Scenarios.csproj\">\n    <Deploy />\n  </Project>\n</Solution>\n"
  },
  {
    "path": "sizes/com.companyname.Hello-Signed.apkdesc",
    "content": "{\n  \"Comment\": null,\n  \"Entries\": {\n    \"AndroidManifest.xml\": {\n      \"Size\": 6304\n    },\n    \"classes.dex\": {\n      \"Size\": 9740848\n    },\n    \"commonMain/default/linkdata/module\": {\n      \"Size\": 281\n    },\n    \"commonMain/default/linkdata/package_androidx.annotation/0_annotation.knm\": {\n      \"Size\": 4603\n    },\n    \"commonMain/default/linkdata/package_androidx.collection.internal/0_internal.knm\": {\n      \"Size\": 697\n    },\n    \"commonMain/default/linkdata/package_androidx.collection.internal/1_internal.knm\": {\n      \"Size\": 871\n    },\n    \"commonMain/default/linkdata/package_androidx.collection/0_collection.knm\": {\n      \"Size\": 50326\n    },\n    \"commonMain/default/linkdata/package_androidx.collection/1_collection.knm\": {\n      \"Size\": 124\n    },\n    \"commonMain/default/linkdata/package_androidx.collection/2_collection.knm\": {\n      \"Size\": 6895\n    },\n    \"commonMain/default/linkdata/package_androidx.collection/3_collection.knm\": {\n      \"Size\": 6451\n    },\n    \"commonMain/default/linkdata/package_androidx.collection/4_collection.knm\": {\n      \"Size\": 6604\n    },\n    \"commonMain/default/linkdata/package_androidx.collection/5_collection.knm\": {\n      \"Size\": 3642\n    },\n    \"commonMain/default/linkdata/package_androidx/0_androidx.knm\": {\n      \"Size\": 20\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.channels/0_channels.knm\": {\n      \"Size\": 16032\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.channels/1_channels.knm\": {\n      \"Size\": 8842\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.flow.internal/0_internal.knm\": {\n      \"Size\": 5146\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.flow.internal/1_internal.knm\": {\n      \"Size\": 1942\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.flow/0_flow.knm\": {\n      \"Size\": 8434\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.flow/1_flow.knm\": {\n      \"Size\": 12759\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.flow/2_flow.knm\": {\n      \"Size\": 9008\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.internal/0_internal.knm\": {\n      \"Size\": 10333\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.internal/1_internal.knm\": {\n      \"Size\": 3585\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.intrinsics/0_intrinsics.knm\": {\n      \"Size\": 1266\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.selects/0_selects.knm\": {\n      \"Size\": 6768\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.selects/1_selects.knm\": {\n      \"Size\": 1849\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.sync/0_sync.knm\": {\n      \"Size\": 4469\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.sync/1_sync.knm\": {\n      \"Size\": 1040\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines/0_coroutines.knm\": {\n      \"Size\": 23712\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines/1_coroutines.knm\": {\n      \"Size\": 5292\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines/2_coroutines.knm\": {\n      \"Size\": 6947\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines/3_coroutines.knm\": {\n      \"Size\": 816\n    },\n    \"commonMain/default/linkdata/package_kotlinx/0_kotlinx.knm\": {\n      \"Size\": 19\n    },\n    \"commonMain/default/linkdata/root_package/0_.knm\": {\n      \"Size\": 12\n    },\n    \"commonMain/default/manifest\": {\n      \"Size\": 138\n    },\n    \"concurrentMain/default/linkdata/module\": {\n      \"Size\": 142\n    },\n    \"concurrentMain/default/linkdata/package_kotlinx.coroutines.channels/0_channels.knm\": {\n      \"Size\": 645\n    },\n    \"concurrentMain/default/linkdata/package_kotlinx.coroutines.internal/0_internal.knm\": {\n      \"Size\": 2230\n    },\n    \"concurrentMain/default/linkdata/package_kotlinx.coroutines.internal/1_internal.knm\": {\n      \"Size\": 491\n    },\n    \"concurrentMain/default/linkdata/package_kotlinx.coroutines/0_coroutines.knm\": {\n      \"Size\": 503\n    },\n    \"concurrentMain/default/linkdata/package_kotlinx.coroutines/1_coroutines.knm\": {\n      \"Size\": 1080\n    },\n    \"concurrentMain/default/linkdata/package_kotlinx/0_kotlinx.knm\": {\n      \"Size\": 19\n    },\n    \"concurrentMain/default/linkdata/root_package/0_.knm\": {\n      \"Size\": 12\n    },\n    \"concurrentMain/default/manifest\": {\n      \"Size\": 142\n    },\n    \"kotlin/annotation/annotation.kotlin_builtins\": {\n      \"Size\": 928\n    },\n    \"kotlin/collections/collections.kotlin_builtins\": {\n      \"Size\": 3685\n    },\n    \"kotlin/coroutines/coroutines.kotlin_builtins\": {\n      \"Size\": 200\n    },\n    \"kotlin/internal/internal.kotlin_builtins\": {\n      \"Size\": 646\n    },\n    \"kotlin/kotlin.kotlin_builtins\": {\n      \"Size\": 18640\n    },\n    \"kotlin/ranges/ranges.kotlin_builtins\": {\n      \"Size\": 3399\n    },\n    \"kotlin/reflect/reflect.kotlin_builtins\": {\n      \"Size\": 2426\n    },\n    \"lib/arm64-v8a/libaot-_Microsoft.Android.Resource.Designer.dll.so\": {\n      \"Size\": 3800\n    },\n    \"lib/arm64-v8a/libaot-CommunityToolkit.Mvvm.dll.so\": {\n      \"Size\": 4368\n    },\n    \"lib/arm64-v8a/libaot-Hello.dll.so\": {\n      \"Size\": 8032\n    },\n    \"lib/arm64-v8a/libaot-Java.Interop.dll.so\": {\n      \"Size\": 164208\n    },\n    \"lib/arm64-v8a/libaot-Microsoft.Maui.Graphics.dll.so\": {\n      \"Size\": 3912\n    },\n    \"lib/arm64-v8a/libaot-Mono.Android.dll.so\": {\n      \"Size\": 293408\n    },\n    \"lib/arm64-v8a/libaot-Mono.Android.Runtime.dll.so\": {\n      \"Size\": 4480\n    },\n    \"lib/arm64-v8a/libaot-Spice.dll.so\": {\n      \"Size\": 41160\n    },\n    \"lib/arm64-v8a/libaot-System.ComponentModel.TypeConverter.dll.so\": {\n      \"Size\": 3800\n    },\n    \"lib/arm64-v8a/libaot-System.Console.dll.so\": {\n      \"Size\": 4768\n    },\n    \"lib/arm64-v8a/libaot-System.Linq.dll.so\": {\n      \"Size\": 22768\n    },\n    \"lib/arm64-v8a/libaot-System.ObjectModel.dll.so\": {\n      \"Size\": 11312\n    },\n    \"lib/arm64-v8a/libaot-System.Private.CoreLib.dll.so\": {\n      \"Size\": 871840\n    },\n    \"lib/arm64-v8a/libaot-System.Runtime.dll.so\": {\n      \"Size\": 3608\n    },\n    \"lib/arm64-v8a/libaot-System.Runtime.InteropServices.dll.so\": {\n      \"Size\": 3640\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.AndroidX.Activity.dll.so\": {\n      \"Size\": 9480\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.AndroidX.AppCompat.dll.so\": {\n      \"Size\": 29904\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.AndroidX.Core.dll.so\": {\n      \"Size\": 15312\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.AndroidX.DrawerLayout.dll.so\": {\n      \"Size\": 8680\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.AndroidX.Fragment.dll.so\": {\n      \"Size\": 19592\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.AndroidX.Lifecycle.Common.dll.so\": {\n      \"Size\": 5072\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.AndroidX.Lifecycle.LiveData.Core.dll.so\": {\n      \"Size\": 5056\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.AndroidX.Lifecycle.ViewModel.dll.so\": {\n      \"Size\": 6288\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.AndroidX.Loader.dll.so\": {\n      \"Size\": 6816\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.AndroidX.SavedState.dll.so\": {\n      \"Size\": 4368\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.Kotlin.StdLib.dll.so\": {\n      \"Size\": 5720\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.KotlinX.Coroutines.Core.Jvm.dll.so\": {\n      \"Size\": 4984\n    },\n    \"lib/arm64-v8a/libarc.bin.so\": {\n      \"Size\": 19168\n    },\n    \"lib/arm64-v8a/libassembly-store.so\": {\n      \"Size\": 1273544\n    },\n    \"lib/arm64-v8a/libmono-component-marshal-ilgen.so\": {\n      \"Size\": 36616\n    },\n    \"lib/arm64-v8a/libmonodroid.so\": {\n      \"Size\": 1408384\n    },\n    \"lib/arm64-v8a/libmonosgen-2.0.so\": {\n      \"Size\": 3123272\n    },\n    \"lib/arm64-v8a/libSystem.Globalization.Native.so\": {\n      \"Size\": 71936\n    },\n    \"lib/arm64-v8a/libSystem.IO.Compression.Native.so\": {\n      \"Size\": 758968\n    },\n    \"lib/arm64-v8a/libSystem.Native.so\": {\n      \"Size\": 104064\n    },\n    \"lib/arm64-v8a/libSystem.Security.Cryptography.Native.Android.so\": {\n      \"Size\": 165536\n    },\n    \"lib/arm64-v8a/libxamarin-app.so\": {\n      \"Size\": 70544\n    },\n    \"META-INF/androidx.activity_activity.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.annotation_annotation-experimental.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.appcompat_appcompat-resources.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.appcompat_appcompat.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.arch.core_core-runtime.version\": {\n      \"Size\": 67\n    },\n    \"META-INF/androidx.cardview_cardview.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.coordinatorlayout_coordinatorlayout.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.core_core-ktx.version\": {\n      \"Size\": 7\n    },\n    \"META-INF/androidx.core_core.version\": {\n      \"Size\": 7\n    },\n    \"META-INF/androidx.cursoradapter_cursoradapter.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.customview_customview-poolingcontainer.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.customview_customview.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.documentfile_documentfile.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.drawerlayout_drawerlayout.version\": {\n      \"Size\": 70\n    },\n    \"META-INF/androidx.dynamicanimation_dynamicanimation.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.emoji2_emoji2-views-helper.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.emoji2_emoji2.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.fragment_fragment.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.interpolator_interpolator.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.legacy_legacy-support-core-utils.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.lifecycle_lifecycle-livedata-core.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.lifecycle_lifecycle-process.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.lifecycle_lifecycle-runtime.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.lifecycle_lifecycle-viewmodel-savedstate.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.lifecycle_lifecycle-viewmodel.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.loader_loader.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.localbroadcastmanager_localbroadcastmanager.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.print_print.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.profileinstaller_profileinstaller.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.recyclerview_recyclerview.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.savedstate_savedstate.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.startup_startup-runtime.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.swiperefreshlayout_swiperefreshlayout.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.tracing_tracing.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.transition_transition.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.vectordrawable_vectordrawable-animated.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.vectordrawable_vectordrawable.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.versionedparcelable_versionedparcelable.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.viewpager_viewpager.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.viewpager2_viewpager2.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/BNDLTOOL.RSA\": {\n      \"Size\": 1607\n    },\n    \"META-INF/BNDLTOOL.SF\": {\n      \"Size\": 125206\n    },\n    \"META-INF/com.android.tools/proguard/coroutines.pro\": {\n      \"Size\": 1345\n    },\n    \"META-INF/com.android.tools/r8-from-1.6.0/coroutines.pro\": {\n      \"Size\": 899\n    },\n    \"META-INF/com.android.tools/r8-upto-3.0.0/coroutines.pro\": {\n      \"Size\": 558\n    },\n    \"META-INF/com.android.tools/r8/coroutines.pro\": {\n      \"Size\": 1190\n    },\n    \"META-INF/com.google.android.material_material.version\": {\n      \"Size\": 7\n    },\n    \"META-INF/kotlin-project-structure-metadata.json\": {\n      \"Size\": 9945\n    },\n    \"META-INF/kotlinx_coroutines_android.version\": {\n      \"Size\": 5\n    },\n    \"META-INF/kotlinx_coroutines_core.version\": {\n      \"Size\": 5\n    },\n    \"META-INF/MANIFEST.MF\": {\n      \"Size\": 125079\n    },\n    \"META-INF/maven/com.google.errorprone/error_prone_annotations/pom.properties\": {\n      \"Size\": 80\n    },\n    \"META-INF/maven/com.google.errorprone/error_prone_annotations/pom.xml\": {\n      \"Size\": 4252\n    },\n    \"META-INF/maven/com.google.guava/listenablefuture/pom.properties\": {\n      \"Size\": 96\n    },\n    \"META-INF/maven/com.google.guava/listenablefuture/pom.xml\": {\n      \"Size\": 2226\n    },\n    \"META-INF/proguard/androidx-annotations.pro\": {\n      \"Size\": 433\n    },\n    \"META-INF/proguard/coroutines.pro\": {\n      \"Size\": 1363\n    },\n    \"META-INF/services/kotlinx.coroutines.CoroutineExceptionHandler\": {\n      \"Size\": 54\n    },\n    \"META-INF/services/kotlinx.coroutines.internal.MainDispatcherFactory\": {\n      \"Size\": 52\n    },\n    \"nativeMain/default/linkdata/module\": {\n      \"Size\": 215\n    },\n    \"nativeMain/default/linkdata/package_androidx.collection.internal/0_internal.knm\": {\n      \"Size\": 1212\n    },\n    \"nativeMain/default/linkdata/package_androidx.collection.internal/1_internal.knm\": {\n      \"Size\": 289\n    },\n    \"nativeMain/default/linkdata/package_androidx.collection/0_collection.knm\": {\n      \"Size\": 3156\n    },\n    \"nativeMain/default/linkdata/package_androidx/0_androidx.knm\": {\n      \"Size\": 20\n    },\n    \"nativeMain/default/linkdata/package_kotlinx.coroutines.flow.internal/0_internal.knm\": {\n      \"Size\": 734\n    },\n    \"nativeMain/default/linkdata/package_kotlinx.coroutines.flow/0_flow.knm\": {\n      \"Size\": 35\n    },\n    \"nativeMain/default/linkdata/package_kotlinx.coroutines.internal/0_internal.knm\": {\n      \"Size\": 2373\n    },\n    \"nativeMain/default/linkdata/package_kotlinx.coroutines.internal/1_internal.knm\": {\n      \"Size\": 1617\n    },\n    \"nativeMain/default/linkdata/package_kotlinx.coroutines/0_coroutines.knm\": {\n      \"Size\": 4024\n    },\n    \"nativeMain/default/linkdata/package_kotlinx.coroutines/1_coroutines.knm\": {\n      \"Size\": 1893\n    },\n    \"nativeMain/default/linkdata/package_kotlinx/0_kotlinx.knm\": {\n      \"Size\": 19\n    },\n    \"nativeMain/default/linkdata/root_package/0_.knm\": {\n      \"Size\": 12\n    },\n    \"nativeMain/default/manifest\": {\n      \"Size\": 248\n    },\n    \"nativeOtherMain/default/linkdata/module\": {\n      \"Size\": 107\n    },\n    \"nativeOtherMain/default/linkdata/package_kotlinx.coroutines/0_coroutines.knm\": {\n      \"Size\": 645\n    },\n    \"nativeOtherMain/default/linkdata/package_kotlinx.coroutines/1_coroutines.knm\": {\n      \"Size\": 347\n    },\n    \"nativeOtherMain/default/linkdata/package_kotlinx/0_kotlinx.knm\": {\n      \"Size\": 19\n    },\n    \"nativeOtherMain/default/linkdata/root_package/0_.knm\": {\n      \"Size\": 12\n    },\n    \"nativeOtherMain/default/manifest\": {\n      \"Size\": 258\n    },\n    \"nonJvmMain/default/linkdata/module\": {\n      \"Size\": 90\n    },\n    \"nonJvmMain/default/linkdata/package_androidx.annotation/0_annotation.knm\": {\n      \"Size\": 991\n    },\n    \"nonJvmMain/default/linkdata/package_androidx/0_androidx.knm\": {\n      \"Size\": 20\n    },\n    \"nonJvmMain/default/linkdata/root_package/0_.knm\": {\n      \"Size\": 12\n    },\n    \"nonJvmMain/default/manifest\": {\n      \"Size\": 193\n    },\n    \"res/anim-v21/design_bottom_sheet_slide_in.xml\": {\n      \"Size\": 616\n    },\n    \"res/anim-v21/design_bottom_sheet_slide_out.xml\": {\n      \"Size\": 616\n    },\n    \"res/anim-v21/fragment_fast_out_extra_slow_in.xml\": {\n      \"Size\": 364\n    },\n    \"res/anim-v21/m3_bottom_sheet_slide_in.xml\": {\n      \"Size\": 616\n    },\n    \"res/anim-v21/m3_bottom_sheet_slide_out.xml\": {\n      \"Size\": 656\n    },\n    \"res/anim-v21/m3_side_sheet_enter_from_left.xml\": {\n      \"Size\": 464\n    },\n    \"res/anim-v21/m3_side_sheet_enter_from_right.xml\": {\n      \"Size\": 464\n    },\n    \"res/anim-v21/m3_side_sheet_exit_to_left.xml\": {\n      \"Size\": 464\n    },\n    \"res/anim-v21/m3_side_sheet_exit_to_right.xml\": {\n      \"Size\": 464\n    },\n    \"res/anim-v21/mtrl_bottom_sheet_slide_in.xml\": {\n      \"Size\": 616\n    },\n    \"res/anim-v21/mtrl_bottom_sheet_slide_out.xml\": {\n      \"Size\": 616\n    },\n    \"res/anim/abc_fade_in.xml\": {\n      \"Size\": 388\n    },\n    \"res/anim/abc_fade_out.xml\": {\n      \"Size\": 388\n    },\n    \"res/anim/abc_grow_fade_in_from_bottom.xml\": {\n      \"Size\": 852\n    },\n    \"res/anim/abc_popup_enter.xml\": {\n      \"Size\": 508\n    },\n    \"res/anim/abc_popup_exit.xml\": {\n      \"Size\": 508\n    },\n    \"res/anim/abc_shrink_fade_out_from_bottom.xml\": {\n      \"Size\": 852\n    },\n    \"res/anim/abc_slide_in_bottom.xml\": {\n      \"Size\": 396\n    },\n    \"res/anim/abc_slide_in_top.xml\": {\n      \"Size\": 396\n    },\n    \"res/anim/abc_slide_out_bottom.xml\": {\n      \"Size\": 396\n    },\n    \"res/anim/abc_slide_out_top.xml\": {\n      \"Size\": 396\n    },\n    \"res/anim/abc_tooltip_enter.xml\": {\n      \"Size\": 388\n    },\n    \"res/anim/abc_tooltip_exit.xml\": {\n      \"Size\": 388\n    },\n    \"res/anim/btn_checkbox_to_checked_box_inner_merged_animation.xml\": {\n      \"Size\": 2124\n    },\n    \"res/anim/btn_checkbox_to_checked_box_outer_merged_animation.xml\": {\n      \"Size\": 2780\n    },\n    \"res/anim/btn_checkbox_to_checked_icon_null_animation.xml\": {\n      \"Size\": 1196\n    },\n    \"res/anim/btn_checkbox_to_unchecked_box_inner_merged_animation.xml\": {\n      \"Size\": 2360\n    },\n    \"res/anim/btn_checkbox_to_unchecked_check_path_merged_animation.xml\": {\n      \"Size\": 2520\n    },\n    \"res/anim/btn_checkbox_to_unchecked_icon_null_animation.xml\": {\n      \"Size\": 1196\n    },\n    \"res/anim/btn_radio_to_off_mtrl_dot_group_animation.xml\": {\n      \"Size\": 1656\n    },\n    \"res/anim/btn_radio_to_off_mtrl_ring_outer_animation.xml\": {\n      \"Size\": 1656\n    },\n    \"res/anim/btn_radio_to_off_mtrl_ring_outer_path_animation.xml\": {\n      \"Size\": 1028\n    },\n    \"res/anim/btn_radio_to_on_mtrl_dot_group_animation.xml\": {\n      \"Size\": 1656\n    },\n    \"res/anim/btn_radio_to_on_mtrl_ring_outer_animation.xml\": {\n      \"Size\": 1656\n    },\n    \"res/anim/btn_radio_to_on_mtrl_ring_outer_path_animation.xml\": {\n      \"Size\": 1028\n    },\n    \"res/anim/design_snackbar_in.xml\": {\n      \"Size\": 312\n    },\n    \"res/anim/design_snackbar_out.xml\": {\n      \"Size\": 312\n    },\n    \"res/anim/linear_indeterminate_line1_head_interpolator.xml\": {\n      \"Size\": 400\n    },\n    \"res/anim/linear_indeterminate_line1_tail_interpolator.xml\": {\n      \"Size\": 400\n    },\n    \"res/anim/linear_indeterminate_line2_head_interpolator.xml\": {\n      \"Size\": 400\n    },\n    \"res/anim/linear_indeterminate_line2_tail_interpolator.xml\": {\n      \"Size\": 400\n    },\n    \"res/anim/m3_motion_fade_enter.xml\": {\n      \"Size\": 812\n    },\n    \"res/anim/m3_motion_fade_exit.xml\": {\n      \"Size\": 508\n    },\n    \"res/anim/mtrl_card_lowers_interpolator.xml\": {\n      \"Size\": 400\n    },\n    \"res/animator-v21/design_appbar_state_list_animator.xml\": {\n      \"Size\": 1216\n    },\n    \"res/animator-v21/m3_appbar_state_list_animator.xml\": {\n      \"Size\": 1216\n    },\n    \"res/animator/design_fab_hide_motion_spec.xml\": {\n      \"Size\": 796\n    },\n    \"res/animator/design_fab_show_motion_spec.xml\": {\n      \"Size\": 796\n    },\n    \"res/animator/fragment_close_enter.xml\": {\n      \"Size\": 1128\n    },\n    \"res/animator/fragment_close_exit.xml\": {\n      \"Size\": 1128\n    },\n    \"res/animator/fragment_fade_enter.xml\": {\n      \"Size\": 452\n    },\n    \"res/animator/fragment_fade_exit.xml\": {\n      \"Size\": 452\n    },\n    \"res/animator/fragment_open_enter.xml\": {\n      \"Size\": 1128\n    },\n    \"res/animator/fragment_open_exit.xml\": {\n      \"Size\": 1128\n    },\n    \"res/animator/m3_btn_elevated_btn_state_list_anim.xml\": {\n      \"Size\": 1796\n    },\n    \"res/animator/m3_btn_state_list_anim.xml\": {\n      \"Size\": 1796\n    },\n    \"res/animator/m3_card_elevated_state_list_anim.xml\": {\n      \"Size\": 1632\n    },\n    \"res/animator/m3_card_state_list_anim.xml\": {\n      \"Size\": 1584\n    },\n    \"res/animator/m3_chip_state_list_anim.xml\": {\n      \"Size\": 1180\n    },\n    \"res/animator/m3_elevated_chip_state_list_anim.xml\": {\n      \"Size\": 1072\n    },\n    \"res/animator/m3_extended_fab_change_size_collapse_motion_spec.xml\": {\n      \"Size\": 1116\n    },\n    \"res/animator/m3_extended_fab_change_size_expand_motion_spec.xml\": {\n      \"Size\": 1116\n    },\n    \"res/animator/m3_extended_fab_hide_motion_spec.xml\": {\n      \"Size\": 820\n    },\n    \"res/animator/m3_extended_fab_show_motion_spec.xml\": {\n      \"Size\": 820\n    },\n    \"res/animator/m3_extended_fab_state_list_animator.xml\": {\n      \"Size\": 2724\n    },\n    \"res/animator/mtrl_btn_state_list_anim.xml\": {\n      \"Size\": 2664\n    },\n    \"res/animator/mtrl_btn_unelevated_state_list_anim.xml\": {\n      \"Size\": 120\n    },\n    \"res/animator/mtrl_card_state_list_anim.xml\": {\n      \"Size\": 1208\n    },\n    \"res/animator/mtrl_chip_state_list_anim.xml\": {\n      \"Size\": 1072\n    },\n    \"res/animator/mtrl_extended_fab_change_size_collapse_motion_spec.xml\": {\n      \"Size\": 1116\n    },\n    \"res/animator/mtrl_extended_fab_change_size_expand_motion_spec.xml\": {\n      \"Size\": 1116\n    },\n    \"res/animator/mtrl_extended_fab_hide_motion_spec.xml\": {\n      \"Size\": 608\n    },\n    \"res/animator/mtrl_extended_fab_show_motion_spec.xml\": {\n      \"Size\": 820\n    },\n    \"res/animator/mtrl_extended_fab_state_list_animator.xml\": {\n      \"Size\": 2724\n    },\n    \"res/animator/mtrl_fab_hide_motion_spec.xml\": {\n      \"Size\": 796\n    },\n    \"res/animator/mtrl_fab_show_motion_spec.xml\": {\n      \"Size\": 796\n    },\n    \"res/animator/mtrl_fab_transformation_sheet_collapse_spec.xml\": {\n      \"Size\": 1888\n    },\n    \"res/animator/mtrl_fab_transformation_sheet_expand_spec.xml\": {\n      \"Size\": 1888\n    },\n    \"res/color-night-v8/material_timepicker_button_stroke.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-night-v8/material_timepicker_clockface.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-night-v8/material_timepicker_modebutton_tint.xml\": {\n      \"Size\": 340\n    },\n    \"res/color-v21/abc_btn_colored_borderless_text_material.xml\": {\n      \"Size\": 464\n    },\n    \"res/color-v23/abc_btn_colored_borderless_text_material.xml\": {\n      \"Size\": 500\n    },\n    \"res/color-v23/abc_btn_colored_text_material.xml\": {\n      \"Size\": 500\n    },\n    \"res/color-v23/abc_color_highlight_material.xml\": {\n      \"Size\": 544\n    },\n    \"res/color-v23/abc_tint_btn_checkable.xml\": {\n      \"Size\": 624\n    },\n    \"res/color-v23/abc_tint_default.xml\": {\n      \"Size\": 1120\n    },\n    \"res/color-v23/abc_tint_edittext.xml\": {\n      \"Size\": 668\n    },\n    \"res/color-v23/abc_tint_seek_thumb.xml\": {\n      \"Size\": 500\n    },\n    \"res/color-v23/abc_tint_spinner.xml\": {\n      \"Size\": 668\n    },\n    \"res/color-v23/abc_tint_switch_track.xml\": {\n      \"Size\": 664\n    },\n    \"res/color-v31/m3_dynamic_dark_default_color_primary_text.xml\": {\n      \"Size\": 500\n    },\n    \"res/color-v31/m3_dynamic_dark_default_color_secondary_text.xml\": {\n      \"Size\": 500\n    },\n    \"res/color-v31/m3_dynamic_dark_highlighted_text.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_dynamic_dark_hint_foreground.xml\": {\n      \"Size\": 564\n    },\n    \"res/color-v31/m3_dynamic_dark_primary_text_disable_only.xml\": {\n      \"Size\": 500\n    },\n    \"res/color-v31/m3_dynamic_default_color_primary_text.xml\": {\n      \"Size\": 500\n    },\n    \"res/color-v31/m3_dynamic_default_color_secondary_text.xml\": {\n      \"Size\": 500\n    },\n    \"res/color-v31/m3_dynamic_highlighted_text.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_dynamic_hint_foreground.xml\": {\n      \"Size\": 564\n    },\n    \"res/color-v31/m3_dynamic_primary_text_disable_only.xml\": {\n      \"Size\": 500\n    },\n    \"res/color-v31/m3_ref_palette_dynamic_neutral12.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_ref_palette_dynamic_neutral17.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_ref_palette_dynamic_neutral22.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_ref_palette_dynamic_neutral24.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_ref_palette_dynamic_neutral4.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_ref_palette_dynamic_neutral6.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_ref_palette_dynamic_neutral87.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_ref_palette_dynamic_neutral92.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_ref_palette_dynamic_neutral94.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_ref_palette_dynamic_neutral96.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_ref_palette_dynamic_neutral98.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/abc_background_cache_hint_selector_material_dark.xml\": {\n      \"Size\": 468\n    },\n    \"res/color/abc_background_cache_hint_selector_material_light.xml\": {\n      \"Size\": 468\n    },\n    \"res/color/abc_btn_colored_text_material.xml\": {\n      \"Size\": 604\n    },\n    \"res/color/abc_hint_foreground_material_dark.xml\": {\n      \"Size\": 564\n    },\n    \"res/color/abc_hint_foreground_material_light.xml\": {\n      \"Size\": 564\n    },\n    \"res/color/abc_primary_text_disable_only_material_dark.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/abc_primary_text_disable_only_material_light.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/abc_primary_text_material_dark.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/abc_primary_text_material_light.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/abc_search_url_text.xml\": {\n      \"Size\": 588\n    },\n    \"res/color/abc_secondary_text_material_dark.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/abc_secondary_text_material_light.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/abc_tint_btn_checkable.xml\": {\n      \"Size\": 728\n    },\n    \"res/color/abc_tint_default.xml\": {\n      \"Size\": 1224\n    },\n    \"res/color/abc_tint_edittext.xml\": {\n      \"Size\": 772\n    },\n    \"res/color/abc_tint_seek_thumb.xml\": {\n      \"Size\": 604\n    },\n    \"res/color/abc_tint_spinner.xml\": {\n      \"Size\": 772\n    },\n    \"res/color/abc_tint_switch_track.xml\": {\n      \"Size\": 768\n    },\n    \"res/color/design_box_stroke_color.xml\": {\n      \"Size\": 712\n    },\n    \"res/color/design_error.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/design_icon_tint.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/m3_appbar_overlay_color.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/m3_assist_chip_icon_tint_color.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_assist_chip_stroke_color.xml\": {\n      \"Size\": 872\n    },\n    \"res/color/m3_bottom_sheet_drag_handle_color.xml\": {\n      \"Size\": 340\n    },\n    \"res/color/m3_button_background_color_selector.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_button_foreground_color_selector.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_button_outline_color_selector.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_button_ripple_color_selector.xml\": {\n      \"Size\": 808\n    },\n    \"res/color/m3_button_ripple_color.xml\": {\n      \"Size\": 808\n    },\n    \"res/color/m3_calendar_item_disabled_text.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/m3_calendar_item_stroke_color.xml\": {\n      \"Size\": 712\n    },\n    \"res/color/m3_card_foreground_color.xml\": {\n      \"Size\": 768\n    },\n    \"res/color/m3_card_ripple_color.xml\": {\n      \"Size\": 1556\n    },\n    \"res/color/m3_card_stroke_color.xml\": {\n      \"Size\": 1224\n    },\n    \"res/color/m3_checkbox_button_icon_tint.xml\": {\n      \"Size\": 964\n    },\n    \"res/color/m3_checkbox_button_tint.xml\": {\n      \"Size\": 1000\n    },\n    \"res/color/m3_chip_assist_text_color.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_chip_background_color.xml\": {\n      \"Size\": 712\n    },\n    \"res/color/m3_chip_ripple_color.xml\": {\n      \"Size\": 1556\n    },\n    \"res/color/m3_chip_stroke_color.xml\": {\n      \"Size\": 872\n    },\n    \"res/color/m3_chip_text_color.xml\": {\n      \"Size\": 624\n    },\n    \"res/color/m3_dark_default_color_primary_text.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_dark_default_color_secondary_text.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_dark_highlighted_text.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/m3_dark_hint_foreground.xml\": {\n      \"Size\": 564\n    },\n    \"res/color/m3_dark_primary_text_disable_only.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_default_color_primary_text.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_default_color_secondary_text.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_efab_ripple_color_selector.xml\": {\n      \"Size\": 808\n    },\n    \"res/color/m3_elevated_chip_background_color.xml\": {\n      \"Size\": 748\n    },\n    \"res/color/m3_fab_efab_background_color_selector.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_fab_efab_foreground_color_selector.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_fab_ripple_color_selector.xml\": {\n      \"Size\": 808\n    },\n    \"res/color/m3_filled_icon_button_container_color_selector.xml\": {\n      \"Size\": 668\n    },\n    \"res/color/m3_highlighted_text.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/m3_hint_foreground.xml\": {\n      \"Size\": 564\n    },\n    \"res/color/m3_icon_button_icon_color_selector.xml\": {\n      \"Size\": 668\n    },\n    \"res/color/m3_navigation_bar_item_with_indicator_icon_tint.xml\": {\n      \"Size\": 1196\n    },\n    \"res/color/m3_navigation_bar_item_with_indicator_label_tint.xml\": {\n      \"Size\": 1196\n    },\n    \"res/color/m3_navigation_bar_ripple_color_selector.xml\": {\n      \"Size\": 1232\n    },\n    \"res/color/m3_navigation_item_background_color.xml\": {\n      \"Size\": 588\n    },\n    \"res/color/m3_navigation_item_icon_tint.xml\": {\n      \"Size\": 1356\n    },\n    \"res/color/m3_navigation_item_ripple_color.xml\": {\n      \"Size\": 1372\n    },\n    \"res/color/m3_navigation_item_text_color.xml\": {\n      \"Size\": 1356\n    },\n    \"res/color/m3_navigation_rail_item_with_indicator_icon_tint.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/m3_navigation_rail_item_with_indicator_label_tint.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/m3_navigation_rail_ripple_color_selector.xml\": {\n      \"Size\": 1232\n    },\n    \"res/color/m3_popupmenu_overlay_color.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/m3_primary_text_disable_only.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_radiobutton_button_tint.xml\": {\n      \"Size\": 1576\n    },\n    \"res/color/m3_radiobutton_ripple_tint.xml\": {\n      \"Size\": 1372\n    },\n    \"res/color/m3_selection_control_ripple_color_selector.xml\": {\n      \"Size\": 1372\n    },\n    \"res/color/m3_simple_item_ripple_color.xml\": {\n      \"Size\": 748\n    },\n    \"res/color/m3_slider_active_track_color.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_slider_halo_color.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_slider_inactive_track_color.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_slider_thumb_color.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_switch_thumb_tint.xml\": {\n      \"Size\": 588\n    },\n    \"res/color/m3_switch_track_tint.xml\": {\n      \"Size\": 624\n    },\n    \"res/color/m3_tabs_icon_color_secondary.xml\": {\n      \"Size\": 624\n    },\n    \"res/color/m3_tabs_icon_color.xml\": {\n      \"Size\": 624\n    },\n    \"res/color/m3_tabs_ripple_color_secondary.xml\": {\n      \"Size\": 1372\n    },\n    \"res/color/m3_tabs_ripple_color.xml\": {\n      \"Size\": 1372\n    },\n    \"res/color/m3_tabs_text_color_secondary.xml\": {\n      \"Size\": 624\n    },\n    \"res/color/m3_tabs_text_color.xml\": {\n      \"Size\": 624\n    },\n    \"res/color/m3_text_button_background_color_selector.xml\": {\n      \"Size\": 508\n    },\n    \"res/color/m3_text_button_foreground_color_selector.xml\": {\n      \"Size\": 748\n    },\n    \"res/color/m3_text_button_ripple_color_selector.xml\": {\n      \"Size\": 1936\n    },\n    \"res/color/m3_textfield_filled_background_color.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_textfield_indicator_text_color.xml\": {\n      \"Size\": 872\n    },\n    \"res/color/m3_textfield_input_text_color.xml\": {\n      \"Size\": 748\n    },\n    \"res/color/m3_textfield_label_color.xml\": {\n      \"Size\": 624\n    },\n    \"res/color/m3_textfield_stroke_color.xml\": {\n      \"Size\": 748\n    },\n    \"res/color/m3_timepicker_button_background_color.xml\": {\n      \"Size\": 528\n    },\n    \"res/color/m3_timepicker_button_ripple_color.xml\": {\n      \"Size\": 1536\n    },\n    \"res/color/m3_timepicker_button_text_color.xml\": {\n      \"Size\": 768\n    },\n    \"res/color/m3_timepicker_clock_text_color.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/m3_timepicker_display_background_color.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/m3_timepicker_display_ripple_color.xml\": {\n      \"Size\": 1372\n    },\n    \"res/color/m3_timepicker_display_text_color.xml\": {\n      \"Size\": 624\n    },\n    \"res/color/m3_timepicker_secondary_text_button_ripple_color.xml\": {\n      \"Size\": 808\n    },\n    \"res/color/m3_timepicker_secondary_text_button_text_color.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_timepicker_time_input_stroke_color.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/m3_tonal_button_ripple_color_selector.xml\": {\n      \"Size\": 808\n    },\n    \"res/color/material_cursor_color.xml\": {\n      \"Size\": 340\n    },\n    \"res/color/material_divider_color.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_on_background_disabled.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_on_background_emphasis_high_type.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_on_background_emphasis_medium.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_on_primary_disabled.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_on_primary_emphasis_high_type.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_on_primary_emphasis_medium.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_on_surface_disabled.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_on_surface_emphasis_high_type.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_on_surface_emphasis_medium.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_on_surface_stroke.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_personalized__highlighted_text_inverse.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_personalized__highlighted_text.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_personalized_color_primary_text_inverse.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/material_personalized_color_primary_text.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/material_personalized_color_secondary_text_inverse.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/material_personalized_color_secondary_text.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/material_personalized_hint_foreground_inverse.xml\": {\n      \"Size\": 564\n    },\n    \"res/color/material_personalized_hint_foreground.xml\": {\n      \"Size\": 564\n    },\n    \"res/color/material_personalized_primary_inverse_text_disable_only.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/material_personalized_primary_text_disable_only.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/material_slider_active_tick_marks_color.xml\": {\n      \"Size\": 520\n    },\n    \"res/color/material_slider_active_track_color.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/material_slider_halo_color.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/material_slider_inactive_tick_marks_color.xml\": {\n      \"Size\": 520\n    },\n    \"res/color/material_slider_inactive_track_color.xml\": {\n      \"Size\": 520\n    },\n    \"res/color/material_slider_thumb_color.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/material_timepicker_button_background.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/material_timepicker_button_stroke.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_timepicker_clock_text_color.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/material_timepicker_clockface.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_timepicker_modebutton_tint.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/mtrl_btn_bg_color_selector.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/mtrl_btn_ripple_color.xml\": {\n      \"Size\": 948\n    },\n    \"res/color/mtrl_btn_stroke_color_selector.xml\": {\n      \"Size\": 520\n    },\n    \"res/color/mtrl_btn_text_btn_bg_color_selector.xml\": {\n      \"Size\": 520\n    },\n    \"res/color/mtrl_btn_text_btn_ripple_color.xml\": {\n      \"Size\": 948\n    },\n    \"res/color/mtrl_btn_text_color_selector.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/mtrl_calendar_item_stroke_color.xml\": {\n      \"Size\": 808\n    },\n    \"res/color/mtrl_calendar_selected_range.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/mtrl_card_view_foreground.xml\": {\n      \"Size\": 788\n    },\n    \"res/color/mtrl_card_view_ripple.xml\": {\n      \"Size\": 768\n    },\n    \"res/color/mtrl_chip_background_color.xml\": {\n      \"Size\": 848\n    },\n    \"res/color/mtrl_chip_close_icon_tint.xml\": {\n      \"Size\": 1092\n    },\n    \"res/color/mtrl_chip_surface_color.xml\": {\n      \"Size\": 340\n    },\n    \"res/color/mtrl_chip_text_color.xml\": {\n      \"Size\": 520\n    },\n    \"res/color/mtrl_choice_chip_background_color.xml\": {\n      \"Size\": 848\n    },\n    \"res/color/mtrl_choice_chip_ripple_color.xml\": {\n      \"Size\": 948\n    },\n    \"res/color/mtrl_choice_chip_text_color.xml\": {\n      \"Size\": 808\n    },\n    \"res/color/mtrl_error.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/mtrl_fab_bg_color_selector.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/mtrl_fab_icon_text_color_selector.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/mtrl_fab_ripple_color.xml\": {\n      \"Size\": 948\n    },\n    \"res/color/mtrl_filled_background_color.xml\": {\n      \"Size\": 808\n    },\n    \"res/color/mtrl_filled_icon_tint.xml\": {\n      \"Size\": 644\n    },\n    \"res/color/mtrl_filled_stroke_color.xml\": {\n      \"Size\": 788\n    },\n    \"res/color/mtrl_indicator_text_color.xml\": {\n      \"Size\": 520\n    },\n    \"res/color/mtrl_navigation_bar_colored_item_tint.xml\": {\n      \"Size\": 520\n    },\n    \"res/color/mtrl_navigation_bar_colored_ripple_color.xml\": {\n      \"Size\": 948\n    },\n    \"res/color/mtrl_navigation_bar_item_tint.xml\": {\n      \"Size\": 520\n    },\n    \"res/color/mtrl_navigation_bar_ripple_color.xml\": {\n      \"Size\": 1672\n    },\n    \"res/color/mtrl_navigation_item_background_color.xml\": {\n      \"Size\": 644\n    },\n    \"res/color/mtrl_navigation_item_icon_tint.xml\": {\n      \"Size\": 624\n    },\n    \"res/color/mtrl_navigation_item_text_color.xml\": {\n      \"Size\": 624\n    },\n    \"res/color/mtrl_on_primary_text_btn_text_color_selector.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/mtrl_on_surface_ripple_color.xml\": {\n      \"Size\": 808\n    },\n    \"res/color/mtrl_outlined_icon_tint.xml\": {\n      \"Size\": 644\n    },\n    \"res/color/mtrl_outlined_stroke_color.xml\": {\n      \"Size\": 788\n    },\n    \"res/color/mtrl_popupmenu_overlay_color.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/mtrl_switch_thumb_icon_tint.xml\": {\n      \"Size\": 784\n    },\n    \"res/color/mtrl_switch_thumb_tint.xml\": {\n      \"Size\": 1028\n    },\n    \"res/color/mtrl_switch_track_decoration_tint.xml\": {\n      \"Size\": 624\n    },\n    \"res/color/mtrl_switch_track_tint.xml\": {\n      \"Size\": 784\n    },\n    \"res/color/mtrl_tabs_colored_ripple_color.xml\": {\n      \"Size\": 948\n    },\n    \"res/color/mtrl_tabs_icon_color_selector_colored.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/mtrl_tabs_icon_color_selector.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/mtrl_tabs_legacy_text_color_selector.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/mtrl_tabs_ripple_color.xml\": {\n      \"Size\": 1672\n    },\n    \"res/color/mtrl_text_btn_text_color_selector.xml\": {\n      \"Size\": 888\n    },\n    \"res/color/switch_thumb_material_dark.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/switch_thumb_material_light.xml\": {\n      \"Size\": 464\n    },\n    \"res/drawable-anydpi-v21/ic_call_answer_low.xml\": {\n      \"Size\": 1320\n    },\n    \"res/drawable-anydpi-v21/ic_call_answer_video_low.xml\": {\n      \"Size\": 736\n    },\n    \"res/drawable-anydpi-v21/ic_call_answer_video.xml\": {\n      \"Size\": 772\n    },\n    \"res/drawable-anydpi-v21/ic_call_answer.xml\": {\n      \"Size\": 1356\n    },\n    \"res/drawable-anydpi-v21/ic_call_decline_low.xml\": {\n      \"Size\": 1492\n    },\n    \"res/drawable-anydpi-v21/ic_call_decline.xml\": {\n      \"Size\": 1528\n    },\n    \"res/drawable-hdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png\": {\n      \"Size\": 272\n    },\n    \"res/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_000.png\": {\n      \"Size\": 227\n    },\n    \"res/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_015.png\": {\n      \"Size\": 404\n    },\n    \"res/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_000.png\": {\n      \"Size\": 464\n    },\n    \"res/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_015.png\": {\n      \"Size\": 563\n    },\n    \"res/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png\": {\n      \"Size\": 1096\n    },\n    \"res/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png\": {\n      \"Size\": 1243\n    },\n    \"res/drawable-hdpi-v4/abc_cab_background_top_mtrl_alpha.9.png\": {\n      \"Size\": 226\n    },\n    \"res/drawable-hdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png\": {\n      \"Size\": 171\n    },\n    \"res/drawable-hdpi-v4/abc_list_divider_mtrl_alpha.9.png\": {\n      \"Size\": 167\n    },\n    \"res/drawable-hdpi-v4/abc_list_focused_holo.9.png\": {\n      \"Size\": 244\n    },\n    \"res/drawable-hdpi-v4/abc_list_longpressed_holo.9.png\": {\n      \"Size\": 212\n    },\n    \"res/drawable-hdpi-v4/abc_list_pressed_holo_dark.9.png\": {\n      \"Size\": 208\n    },\n    \"res/drawable-hdpi-v4/abc_list_pressed_holo_light.9.png\": {\n      \"Size\": 208\n    },\n    \"res/drawable-hdpi-v4/abc_list_selector_disabled_holo_dark.9.png\": {\n      \"Size\": 228\n    },\n    \"res/drawable-hdpi-v4/abc_list_selector_disabled_holo_light.9.png\": {\n      \"Size\": 229\n    },\n    \"res/drawable-hdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png\": {\n      \"Size\": 738\n    },\n    \"res/drawable-hdpi-v4/abc_popup_background_mtrl_mult.9.png\": {\n      \"Size\": 1098\n    },\n    \"res/drawable-hdpi-v4/abc_scrubber_control_off_mtrl_alpha.png\": {\n      \"Size\": 201\n    },\n    \"res/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png\": {\n      \"Size\": 196\n    },\n    \"res/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png\": {\n      \"Size\": 272\n    },\n    \"res/drawable-hdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png\": {\n      \"Size\": 205\n    },\n    \"res/drawable-hdpi-v4/abc_scrubber_track_mtrl_alpha.9.png\": {\n      \"Size\": 196\n    },\n    \"res/drawable-hdpi-v4/abc_spinner_mtrl_am_alpha.9.png\": {\n      \"Size\": 345\n    },\n    \"res/drawable-hdpi-v4/abc_switch_track_mtrl_alpha.9.png\": {\n      \"Size\": 484\n    },\n    \"res/drawable-hdpi-v4/abc_tab_indicator_mtrl_alpha.9.png\": {\n      \"Size\": 190\n    },\n    \"res/drawable-hdpi-v4/abc_text_select_handle_left_mtrl.png\": {\n      \"Size\": 278\n    },\n    \"res/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl.png\": {\n      \"Size\": 396\n    },\n    \"res/drawable-hdpi-v4/abc_text_select_handle_right_mtrl.png\": {\n      \"Size\": 262\n    },\n    \"res/drawable-hdpi-v4/abc_textfield_activated_mtrl_alpha.9.png\": {\n      \"Size\": 186\n    },\n    \"res/drawable-hdpi-v4/abc_textfield_default_mtrl_alpha.9.png\": {\n      \"Size\": 192\n    },\n    \"res/drawable-hdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png\": {\n      \"Size\": 178\n    },\n    \"res/drawable-hdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png\": {\n      \"Size\": 178\n    },\n    \"res/drawable-hdpi-v4/ic_call_answer_low.png\": {\n      \"Size\": 472\n    },\n    \"res/drawable-hdpi-v4/ic_call_answer_video_low.png\": {\n      \"Size\": 254\n    },\n    \"res/drawable-hdpi-v4/ic_call_answer_video.png\": {\n      \"Size\": 254\n    },\n    \"res/drawable-hdpi-v4/ic_call_answer.png\": {\n      \"Size\": 472\n    },\n    \"res/drawable-hdpi-v4/ic_call_decline_low.png\": {\n      \"Size\": 375\n    },\n    \"res/drawable-hdpi-v4/ic_call_decline.png\": {\n      \"Size\": 375\n    },\n    \"res/drawable-hdpi-v4/notification_bg_low_normal.9.png\": {\n      \"Size\": 212\n    },\n    \"res/drawable-hdpi-v4/notification_bg_low_pressed.9.png\": {\n      \"Size\": 225\n    },\n    \"res/drawable-hdpi-v4/notification_bg_normal_pressed.9.png\": {\n      \"Size\": 225\n    },\n    \"res/drawable-hdpi-v4/notification_bg_normal.9.png\": {\n      \"Size\": 212\n    },\n    \"res/drawable-hdpi-v4/notification_oversize_large_icon_bg.png\": {\n      \"Size\": 909\n    },\n    \"res/drawable-hdpi-v4/notify_panel_notification_icon_bg.png\": {\n      \"Size\": 107\n    },\n    \"res/drawable-hdpi-v4/spice.png\": {\n      \"Size\": 6895\n    },\n    \"res/drawable-hdpi-v4/splash.png\": {\n      \"Size\": 1455\n    },\n    \"res/drawable-ldpi-v4/ic_call_answer_low.png\": {\n      \"Size\": 270\n    },\n    \"res/drawable-ldpi-v4/ic_call_answer_video_low.png\": {\n      \"Size\": 199\n    },\n    \"res/drawable-ldpi-v4/ic_call_answer_video.png\": {\n      \"Size\": 199\n    },\n    \"res/drawable-ldpi-v4/ic_call_answer.png\": {\n      \"Size\": 270\n    },\n    \"res/drawable-ldpi-v4/ic_call_decline_low.png\": {\n      \"Size\": 201\n    },\n    \"res/drawable-ldpi-v4/ic_call_decline.png\": {\n      \"Size\": 201\n    },\n    \"res/drawable-ldrtl-hdpi-v17/abc_spinner_mtrl_am_alpha.9.png\": {\n      \"Size\": 345\n    },\n    \"res/drawable-ldrtl-mdpi-v17/abc_spinner_mtrl_am_alpha.9.png\": {\n      \"Size\": 318\n    },\n    \"res/drawable-ldrtl-xhdpi-v17/abc_spinner_mtrl_am_alpha.9.png\": {\n      \"Size\": 417\n    },\n    \"res/drawable-ldrtl-xxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png\": {\n      \"Size\": 525\n    },\n    \"res/drawable-ldrtl-xxxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png\": {\n      \"Size\": 437\n    },\n    \"res/drawable-mdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png\": {\n      \"Size\": 267\n    },\n    \"res/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_000.png\": {\n      \"Size\": 214\n    },\n    \"res/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_015.png\": {\n      \"Size\": 321\n    },\n    \"res/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_000.png\": {\n      \"Size\": 324\n    },\n    \"res/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_015.png\": {\n      \"Size\": 356\n    },\n    \"res/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png\": {\n      \"Size\": 754\n    },\n    \"res/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png\": {\n      \"Size\": 825\n    },\n    \"res/drawable-mdpi-v4/abc_cab_background_top_mtrl_alpha.9.png\": {\n      \"Size\": 216\n    },\n    \"res/drawable-mdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png\": {\n      \"Size\": 173\n    },\n    \"res/drawable-mdpi-v4/abc_list_divider_mtrl_alpha.9.png\": {\n      \"Size\": 167\n    },\n    \"res/drawable-mdpi-v4/abc_list_focused_holo.9.png\": {\n      \"Size\": 222\n    },\n    \"res/drawable-mdpi-v4/abc_list_longpressed_holo.9.png\": {\n      \"Size\": 211\n    },\n    \"res/drawable-mdpi-v4/abc_list_pressed_holo_dark.9.png\": {\n      \"Size\": 207\n    },\n    \"res/drawable-mdpi-v4/abc_list_pressed_holo_light.9.png\": {\n      \"Size\": 207\n    },\n    \"res/drawable-mdpi-v4/abc_list_selector_disabled_holo_dark.9.png\": {\n      \"Size\": 217\n    },\n    \"res/drawable-mdpi-v4/abc_list_selector_disabled_holo_light.9.png\": {\n      \"Size\": 217\n    },\n    \"res/drawable-mdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png\": {\n      \"Size\": 541\n    },\n    \"res/drawable-mdpi-v4/abc_popup_background_mtrl_mult.9.png\": {\n      \"Size\": 776\n    },\n    \"res/drawable-mdpi-v4/abc_scrubber_control_off_mtrl_alpha.png\": {\n      \"Size\": 159\n    },\n    \"res/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png\": {\n      \"Size\": 145\n    },\n    \"res/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png\": {\n      \"Size\": 197\n    },\n    \"res/drawable-mdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png\": {\n      \"Size\": 203\n    },\n    \"res/drawable-mdpi-v4/abc_scrubber_track_mtrl_alpha.9.png\": {\n      \"Size\": 194\n    },\n    \"res/drawable-mdpi-v4/abc_spinner_mtrl_am_alpha.9.png\": {\n      \"Size\": 327\n    },\n    \"res/drawable-mdpi-v4/abc_switch_track_mtrl_alpha.9.png\": {\n      \"Size\": 395\n    },\n    \"res/drawable-mdpi-v4/abc_tab_indicator_mtrl_alpha.9.png\": {\n      \"Size\": 186\n    },\n    \"res/drawable-mdpi-v4/abc_text_select_handle_left_mtrl.png\": {\n      \"Size\": 203\n    },\n    \"res/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl.png\": {\n      \"Size\": 310\n    },\n    \"res/drawable-mdpi-v4/abc_text_select_handle_right_mtrl.png\": {\n      \"Size\": 186\n    },\n    \"res/drawable-mdpi-v4/abc_textfield_activated_mtrl_alpha.9.png\": {\n      \"Size\": 181\n    },\n    \"res/drawable-mdpi-v4/abc_textfield_default_mtrl_alpha.9.png\": {\n      \"Size\": 178\n    },\n    \"res/drawable-mdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png\": {\n      \"Size\": 178\n    },\n    \"res/drawable-mdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png\": {\n      \"Size\": 178\n    },\n    \"res/drawable-mdpi-v4/ic_call_answer_low.png\": {\n      \"Size\": 317\n    },\n    \"res/drawable-mdpi-v4/ic_call_answer_video_low.png\": {\n      \"Size\": 206\n    },\n    \"res/drawable-mdpi-v4/ic_call_answer_video.png\": {\n      \"Size\": 206\n    },\n    \"res/drawable-mdpi-v4/ic_call_answer.png\": {\n      \"Size\": 317\n    },\n    \"res/drawable-mdpi-v4/ic_call_decline_low.png\": {\n      \"Size\": 264\n    },\n    \"res/drawable-mdpi-v4/ic_call_decline.png\": {\n      \"Size\": 264\n    },\n    \"res/drawable-mdpi-v4/notification_bg_low_normal.9.png\": {\n      \"Size\": 215\n    },\n    \"res/drawable-mdpi-v4/notification_bg_low_pressed.9.png\": {\n      \"Size\": 223\n    },\n    \"res/drawable-mdpi-v4/notification_bg_normal_pressed.9.png\": {\n      \"Size\": 223\n    },\n    \"res/drawable-mdpi-v4/notification_bg_normal.9.png\": {\n      \"Size\": 215\n    },\n    \"res/drawable-mdpi-v4/notify_panel_notification_icon_bg.png\": {\n      \"Size\": 98\n    },\n    \"res/drawable-mdpi-v4/spice.png\": {\n      \"Size\": 4314\n    },\n    \"res/drawable-mdpi-v4/splash.png\": {\n      \"Size\": 1241\n    },\n    \"res/drawable-v21/abc_action_bar_item_background_material.xml\": {\n      \"Size\": 264\n    },\n    \"res/drawable-v21/abc_btn_colored_material.xml\": {\n      \"Size\": 1716\n    },\n    \"res/drawable-v21/abc_dialog_material_background.xml\": {\n      \"Size\": 716\n    },\n    \"res/drawable-v21/abc_edit_text_material.xml\": {\n      \"Size\": 1172\n    },\n    \"res/drawable-v21/abc_list_divider_material.xml\": {\n      \"Size\": 516\n    },\n    \"res/drawable-v21/m3_tabs_background.xml\": {\n      \"Size\": 776\n    },\n    \"res/drawable-v21/material_cursor_drawable.xml\": {\n      \"Size\": 588\n    },\n    \"res/drawable-v21/mtrl_navigation_bar_item_background.xml\": {\n      \"Size\": 264\n    },\n    \"res/drawable-v21/notification_action_background.xml\": {\n      \"Size\": 1180\n    },\n    \"res/drawable-v23/abc_control_background_material.xml\": {\n      \"Size\": 304\n    },\n    \"res/drawable-v23/m3_appbar_background.xml\": {\n      \"Size\": 684\n    },\n    \"res/drawable-v23/m3_popupmenu_background_overlay.xml\": {\n      \"Size\": 1228\n    },\n    \"res/drawable-v23/m3_radiobutton_ripple.xml\": {\n      \"Size\": 304\n    },\n    \"res/drawable-v23/m3_selection_control_ripple.xml\": {\n      \"Size\": 304\n    },\n    \"res/drawable-v23/m3_tabs_background.xml\": {\n      \"Size\": 868\n    },\n    \"res/drawable-v23/m3_tabs_transparent_background.xml\": {\n      \"Size\": 632\n    },\n    \"res/drawable-v23/mtrl_popupmenu_background_overlay.xml\": {\n      \"Size\": 1228\n    },\n    \"res/drawable-v31/maui_splash_image.xml\": {\n      \"Size\": 580\n    },\n    \"res/drawable-watch-v20/abc_dialog_material_background.xml\": {\n      \"Size\": 372\n    },\n    \"res/drawable-xhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png\": {\n      \"Size\": 280\n    },\n    \"res/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_000.png\": {\n      \"Size\": 281\n    },\n    \"res/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_015.png\": {\n      \"Size\": 432\n    },\n    \"res/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_000.png\": {\n      \"Size\": 651\n    },\n    \"res/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_015.png\": {\n      \"Size\": 785\n    },\n    \"res/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png\": {\n      \"Size\": 1526\n    },\n    \"res/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png\": {\n      \"Size\": 1731\n    },\n    \"res/drawable-xhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png\": {\n      \"Size\": 229\n    },\n    \"res/drawable-xhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png\": {\n      \"Size\": 228\n    },\n    \"res/drawable-xhdpi-v4/abc_list_divider_mtrl_alpha.9.png\": {\n      \"Size\": 167\n    },\n    \"res/drawable-xhdpi-v4/abc_list_focused_holo.9.png\": {\n      \"Size\": 244\n    },\n    \"res/drawable-xhdpi-v4/abc_list_longpressed_holo.9.png\": {\n      \"Size\": 214\n    },\n    \"res/drawable-xhdpi-v4/abc_list_pressed_holo_dark.9.png\": {\n      \"Size\": 209\n    },\n    \"res/drawable-xhdpi-v4/abc_list_pressed_holo_light.9.png\": {\n      \"Size\": 209\n    },\n    \"res/drawable-xhdpi-v4/abc_list_selector_disabled_holo_dark.9.png\": {\n      \"Size\": 236\n    },\n    \"res/drawable-xhdpi-v4/abc_list_selector_disabled_holo_light.9.png\": {\n      \"Size\": 235\n    },\n    \"res/drawable-xhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png\": {\n      \"Size\": 966\n    },\n    \"res/drawable-xhdpi-v4/abc_popup_background_mtrl_mult.9.png\": {\n      \"Size\": 1544\n    },\n    \"res/drawable-xhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png\": {\n      \"Size\": 267\n    },\n    \"res/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png\": {\n      \"Size\": 267\n    },\n    \"res/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png\": {\n      \"Size\": 391\n    },\n    \"res/drawable-xhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png\": {\n      \"Size\": 208\n    },\n    \"res/drawable-xhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png\": {\n      \"Size\": 198\n    },\n    \"res/drawable-xhdpi-v4/abc_spinner_mtrl_am_alpha.9.png\": {\n      \"Size\": 448\n    },\n    \"res/drawable-xhdpi-v4/abc_switch_track_mtrl_alpha.9.png\": {\n      \"Size\": 618\n    },\n    \"res/drawable-xhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png\": {\n      \"Size\": 194\n    },\n    \"res/drawable-xhdpi-v4/abc_text_select_handle_left_mtrl.png\": {\n      \"Size\": 335\n    },\n    \"res/drawable-xhdpi-v4/abc_text_select_handle_middle_mtrl.png\": {\n      \"Size\": 585\n    },\n    \"res/drawable-xhdpi-v4/abc_text_select_handle_right_mtrl.png\": {\n      \"Size\": 318\n    },\n    \"res/drawable-xhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png\": {\n      \"Size\": 189\n    },\n    \"res/drawable-xhdpi-v4/abc_textfield_default_mtrl_alpha.9.png\": {\n      \"Size\": 187\n    },\n    \"res/drawable-xhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png\": {\n      \"Size\": 184\n    },\n    \"res/drawable-xhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png\": {\n      \"Size\": 182\n    },\n    \"res/drawable-xhdpi-v4/ic_call_answer_low.png\": {\n      \"Size\": 623\n    },\n    \"res/drawable-xhdpi-v4/ic_call_answer_video_low.png\": {\n      \"Size\": 290\n    },\n    \"res/drawable-xhdpi-v4/ic_call_answer_video.png\": {\n      \"Size\": 290\n    },\n    \"res/drawable-xhdpi-v4/ic_call_answer.png\": {\n      \"Size\": 623\n    },\n    \"res/drawable-xhdpi-v4/ic_call_decline_low.png\": {\n      \"Size\": 452\n    },\n    \"res/drawable-xhdpi-v4/ic_call_decline.png\": {\n      \"Size\": 452\n    },\n    \"res/drawable-xhdpi-v4/notification_bg_low_normal.9.png\": {\n      \"Size\": 221\n    },\n    \"res/drawable-xhdpi-v4/notification_bg_low_pressed.9.png\": {\n      \"Size\": 252\n    },\n    \"res/drawable-xhdpi-v4/notification_bg_normal_pressed.9.png\": {\n      \"Size\": 247\n    },\n    \"res/drawable-xhdpi-v4/notification_bg_normal.9.png\": {\n      \"Size\": 221\n    },\n    \"res/drawable-xhdpi-v4/notify_panel_notification_icon_bg.png\": {\n      \"Size\": 138\n    },\n    \"res/drawable-xhdpi-v4/spice.png\": {\n      \"Size\": 8300\n    },\n    \"res/drawable-xhdpi-v4/splash.png\": {\n      \"Size\": 2041\n    },\n    \"res/drawable-xxhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png\": {\n      \"Size\": 286\n    },\n    \"res/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_000.png\": {\n      \"Size\": 307\n    },\n    \"res/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_015.png\": {\n      \"Size\": 593\n    },\n    \"res/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png\": {\n      \"Size\": 984\n    },\n    \"res/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png\": {\n      \"Size\": 1208\n    },\n    \"res/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png\": {\n      \"Size\": 2463\n    },\n    \"res/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png\": {\n      \"Size\": 2834\n    },\n    \"res/drawable-xxhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png\": {\n      \"Size\": 237\n    },\n    \"res/drawable-xxhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png\": {\n      \"Size\": 224\n    },\n    \"res/drawable-xxhdpi-v4/abc_list_divider_mtrl_alpha.9.png\": {\n      \"Size\": 171\n    },\n    \"res/drawable-xxhdpi-v4/abc_list_focused_holo.9.png\": {\n      \"Size\": 245\n    },\n    \"res/drawable-xxhdpi-v4/abc_list_longpressed_holo.9.png\": {\n      \"Size\": 221\n    },\n    \"res/drawable-xxhdpi-v4/abc_list_pressed_holo_dark.9.png\": {\n      \"Size\": 212\n    },\n    \"res/drawable-xxhdpi-v4/abc_list_pressed_holo_light.9.png\": {\n      \"Size\": 212\n    },\n    \"res/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_dark.9.png\": {\n      \"Size\": 260\n    },\n    \"res/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_light.9.png\": {\n      \"Size\": 258\n    },\n    \"res/drawable-xxhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png\": {\n      \"Size\": 1779\n    },\n    \"res/drawable-xxhdpi-v4/abc_popup_background_mtrl_mult.9.png\": {\n      \"Size\": 2305\n    },\n    \"res/drawable-xxhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png\": {\n      \"Size\": 322\n    },\n    \"res/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png\": {\n      \"Size\": 403\n    },\n    \"res/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png\": {\n      \"Size\": 595\n    },\n    \"res/drawable-xxhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png\": {\n      \"Size\": 210\n    },\n    \"res/drawable-xxhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png\": {\n      \"Size\": 207\n    },\n    \"res/drawable-xxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png\": {\n      \"Size\": 524\n    },\n    \"res/drawable-xxhdpi-v4/abc_switch_track_mtrl_alpha.9.png\": {\n      \"Size\": 851\n    },\n    \"res/drawable-xxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png\": {\n      \"Size\": 204\n    },\n    \"res/drawable-xxhdpi-v4/abc_text_select_handle_left_mtrl.png\": {\n      \"Size\": 420\n    },\n    \"res/drawable-xxhdpi-v4/abc_text_select_handle_middle_mtrl.png\": {\n      \"Size\": 753\n    },\n    \"res/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl.png\": {\n      \"Size\": 422\n    },\n    \"res/drawable-xxhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png\": {\n      \"Size\": 199\n    },\n    \"res/drawable-xxhdpi-v4/abc_textfield_default_mtrl_alpha.9.png\": {\n      \"Size\": 200\n    },\n    \"res/drawable-xxhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png\": {\n      \"Size\": 187\n    },\n    \"res/drawable-xxhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png\": {\n      \"Size\": 186\n    },\n    \"res/drawable-xxhdpi-v4/ic_call_answer_low.png\": {\n      \"Size\": 884\n    },\n    \"res/drawable-xxhdpi-v4/ic_call_answer_video_low.png\": {\n      \"Size\": 384\n    },\n    \"res/drawable-xxhdpi-v4/ic_call_answer_video.png\": {\n      \"Size\": 384\n    },\n    \"res/drawable-xxhdpi-v4/ic_call_answer.png\": {\n      \"Size\": 884\n    },\n    \"res/drawable-xxhdpi-v4/ic_call_decline_low.png\": {\n      \"Size\": 628\n    },\n    \"res/drawable-xxhdpi-v4/ic_call_decline.png\": {\n      \"Size\": 628\n    },\n    \"res/drawable-xxhdpi-v4/spice.png\": {\n      \"Size\": 13935\n    },\n    \"res/drawable-xxhdpi-v4/splash.png\": {\n      \"Size\": 2574\n    },\n    \"res/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_000.png\": {\n      \"Size\": 275\n    },\n    \"res/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_015.png\": {\n      \"Size\": 476\n    },\n    \"res/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png\": {\n      \"Size\": 785\n    },\n    \"res/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png\": {\n      \"Size\": 946\n    },\n    \"res/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png\": {\n      \"Size\": 2505\n    },\n    \"res/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png\": {\n      \"Size\": 2816\n    },\n    \"res/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png\": {\n      \"Size\": 415\n    },\n    \"res/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png\": {\n      \"Size\": 631\n    },\n    \"res/drawable-xxxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png\": {\n      \"Size\": 430\n    },\n    \"res/drawable-xxxhdpi-v4/abc_switch_track_mtrl_alpha.9.png\": {\n      \"Size\": 813\n    },\n    \"res/drawable-xxxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png\": {\n      \"Size\": 202\n    },\n    \"res/drawable-xxxhdpi-v4/abc_text_select_handle_left_mtrl.png\": {\n      \"Size\": 513\n    },\n    \"res/drawable-xxxhdpi-v4/abc_text_select_handle_right_mtrl.png\": {\n      \"Size\": 513\n    },\n    \"res/drawable-xxxhdpi-v4/ic_call_answer_low.png\": {\n      \"Size\": 1171\n    },\n    \"res/drawable-xxxhdpi-v4/ic_call_answer_video_low.png\": {\n      \"Size\": 465\n    },\n    \"res/drawable-xxxhdpi-v4/ic_call_answer_video.png\": {\n      \"Size\": 465\n    },\n    \"res/drawable-xxxhdpi-v4/ic_call_answer.png\": {\n      \"Size\": 1171\n    },\n    \"res/drawable-xxxhdpi-v4/ic_call_decline_low.png\": {\n      \"Size\": 823\n    },\n    \"res/drawable-xxxhdpi-v4/ic_call_decline.png\": {\n      \"Size\": 823\n    },\n    \"res/drawable-xxxhdpi-v4/spice.png\": {\n      \"Size\": 15087\n    },\n    \"res/drawable-xxxhdpi-v4/splash.png\": {\n      \"Size\": 2532\n    },\n    \"res/drawable/$avd_hide_password__0.xml\": {\n      \"Size\": 1176\n    },\n    \"res/drawable/$avd_hide_password__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$avd_hide_password__2.xml\": {\n      \"Size\": 556\n    },\n    \"res/drawable/$avd_show_password__0.xml\": {\n      \"Size\": 1136\n    },\n    \"res/drawable/$avd_show_password__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$avd_show_password__2.xml\": {\n      \"Size\": 556\n    },\n    \"res/drawable/$m3_avd_hide_password__0.xml\": {\n      \"Size\": 1176\n    },\n    \"res/drawable/$m3_avd_hide_password__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$m3_avd_hide_password__2.xml\": {\n      \"Size\": 556\n    },\n    \"res/drawable/$m3_avd_show_password__0.xml\": {\n      \"Size\": 1136\n    },\n    \"res/drawable/$m3_avd_show_password__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$m3_avd_show_password__2.xml\": {\n      \"Size\": 556\n    },\n    \"res/drawable/$mtrl_checkbox_button_checked_unchecked__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_checked_unchecked__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_checked_unchecked__2.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_checked_indeterminate__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_checked_unchecked__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_checked_unchecked__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_checked_unchecked__2.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_indeterminate_checked__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_indeterminate_unchecked__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_indeterminate_unchecked__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_indeterminate_unchecked__2.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_unchecked_checked__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_unchecked_checked__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_unchecked_checked__2.xml\": {\n      \"Size\": 596\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_unchecked_indeterminate__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_unchecked_indeterminate__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_unchecked_indeterminate__2.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_unchecked_checked__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_unchecked_checked__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_unchecked_checked__2.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_switch_thumb_checked_pressed__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_switch_thumb_checked_unchecked__0.xml\": {\n      \"Size\": 548\n    },\n    \"res/drawable/$mtrl_switch_thumb_checked_unchecked__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_switch_thumb_pressed_checked__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_switch_thumb_pressed_unchecked__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_switch_thumb_unchecked_checked__0.xml\": {\n      \"Size\": 548\n    },\n    \"res/drawable/$mtrl_switch_thumb_unchecked_checked__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_switch_thumb_unchecked_pressed__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/abc_btn_borderless_material.xml\": {\n      \"Size\": 588\n    },\n    \"res/drawable/abc_btn_check_material_anim.xml\": {\n      \"Size\": 816\n    },\n    \"res/drawable/abc_btn_check_material.xml\": {\n      \"Size\": 464\n    },\n    \"res/drawable/abc_btn_default_mtrl_shape.xml\": {\n      \"Size\": 932\n    },\n    \"res/drawable/abc_btn_radio_material_anim.xml\": {\n      \"Size\": 816\n    },\n    \"res/drawable/abc_btn_radio_material.xml\": {\n      \"Size\": 464\n    },\n    \"res/drawable/abc_cab_background_internal_bg.xml\": {\n      \"Size\": 372\n    },\n    \"res/drawable/abc_cab_background_top_material.xml\": {\n      \"Size\": 336\n    },\n    \"res/drawable/abc_ic_ab_back_material.xml\": {\n      \"Size\": 692\n    },\n    \"res/drawable/abc_ic_arrow_drop_right_black_24dp.xml\": {\n      \"Size\": 1000\n    },\n    \"res/drawable/abc_ic_clear_material.xml\": {\n      \"Size\": 684\n    },\n    \"res/drawable/abc_ic_go_search_api_material.xml\": {\n      \"Size\": 640\n    },\n    \"res/drawable/abc_ic_menu_copy_mtrl_am_alpha.xml\": {\n      \"Size\": 756\n    },\n    \"res/drawable/abc_ic_menu_cut_mtrl_alpha.xml\": {\n      \"Size\": 1096\n    },\n    \"res/drawable/abc_ic_menu_overflow_material.xml\": {\n      \"Size\": 792\n    },\n    \"res/drawable/abc_ic_menu_paste_mtrl_am_alpha.xml\": {\n      \"Size\": 796\n    },\n    \"res/drawable/abc_ic_menu_selectall_mtrl_alpha.xml\": {\n      \"Size\": 920\n    },\n    \"res/drawable/abc_ic_menu_share_mtrl_alpha.xml\": {\n      \"Size\": 980\n    },\n    \"res/drawable/abc_ic_search_api_material.xml\": {\n      \"Size\": 812\n    },\n    \"res/drawable/abc_ic_voice_search_api_material.xml\": {\n      \"Size\": 828\n    },\n    \"res/drawable/abc_item_background_holo_dark.xml\": {\n      \"Size\": 1012\n    },\n    \"res/drawable/abc_item_background_holo_light.xml\": {\n      \"Size\": 1012\n    },\n    \"res/drawable/abc_list_selector_background_transition_holo_dark.xml\": {\n      \"Size\": 424\n    },\n    \"res/drawable/abc_list_selector_background_transition_holo_light.xml\": {\n      \"Size\": 424\n    },\n    \"res/drawable/abc_list_selector_holo_dark.xml\": {\n      \"Size\": 1064\n    },\n    \"res/drawable/abc_list_selector_holo_light.xml\": {\n      \"Size\": 1064\n    },\n    \"res/drawable/abc_ratingbar_indicator_material.xml\": {\n      \"Size\": 124\n    },\n    \"res/drawable/abc_ratingbar_material.xml\": {\n      \"Size\": 124\n    },\n    \"res/drawable/abc_ratingbar_small_material.xml\": {\n      \"Size\": 124\n    },\n    \"res/drawable/abc_seekbar_thumb_material.xml\": {\n      \"Size\": 1100\n    },\n    \"res/drawable/abc_seekbar_tick_mark_material.xml\": {\n      \"Size\": 516\n    },\n    \"res/drawable/abc_seekbar_track_material.xml\": {\n      \"Size\": 1408\n    },\n    \"res/drawable/abc_spinner_textfield_background_material.xml\": {\n      \"Size\": 1160\n    },\n    \"res/drawable/abc_star_black_48dp.xml\": {\n      \"Size\": 640\n    },\n    \"res/drawable/abc_star_half_black_48dp.xml\": {\n      \"Size\": 600\n    },\n    \"res/drawable/abc_switch_thumb_material.xml\": {\n      \"Size\": 464\n    },\n    \"res/drawable/abc_tab_indicator_material.xml\": {\n      \"Size\": 468\n    },\n    \"res/drawable/abc_text_cursor_material.xml\": {\n      \"Size\": 516\n    },\n    \"res/drawable/abc_textfield_search_material.xml\": {\n      \"Size\": 756\n    },\n    \"res/drawable/abc_vector_test.xml\": {\n      \"Size\": 612\n    },\n    \"res/drawable/avd_hide_password.xml\": {\n      \"Size\": 660\n    },\n    \"res/drawable/avd_show_password.xml\": {\n      \"Size\": 660\n    },\n    \"res/drawable/btn_checkbox_checked_mtrl.xml\": {\n      \"Size\": 2688\n    },\n    \"res/drawable/btn_checkbox_checked_to_unchecked_mtrl_animation.xml\": {\n      \"Size\": 688\n    },\n    \"res/drawable/btn_checkbox_unchecked_mtrl.xml\": {\n      \"Size\": 2660\n    },\n    \"res/drawable/btn_checkbox_unchecked_to_checked_mtrl_animation.xml\": {\n      \"Size\": 688\n    },\n    \"res/drawable/btn_radio_off_mtrl.xml\": {\n      \"Size\": 1728\n    },\n    \"res/drawable/btn_radio_off_to_on_mtrl_animation.xml\": {\n      \"Size\": 680\n    },\n    \"res/drawable/btn_radio_on_mtrl.xml\": {\n      \"Size\": 1656\n    },\n    \"res/drawable/btn_radio_on_to_off_mtrl_animation.xml\": {\n      \"Size\": 680\n    },\n    \"res/drawable/design_fab_background.xml\": {\n      \"Size\": 372\n    },\n    \"res/drawable/design_ic_visibility_off.xml\": {\n      \"Size\": 1144\n    },\n    \"res/drawable/design_ic_visibility.xml\": {\n      \"Size\": 540\n    },\n    \"res/drawable/design_password_eye.xml\": {\n      \"Size\": 816\n    },\n    \"res/drawable/design_snackbar_background.xml\": {\n      \"Size\": 484\n    },\n    \"res/drawable/ic_arrow_back_black_24.xml\": {\n      \"Size\": 612\n    },\n    \"res/drawable/ic_clear_black_24.xml\": {\n      \"Size\": 684\n    },\n    \"res/drawable/ic_clock_black_24dp.xml\": {\n      \"Size\": 752\n    },\n    \"res/drawable/ic_keyboard_black_24dp.xml\": {\n      \"Size\": 852\n    },\n    \"res/drawable/ic_m3_chip_check.xml\": {\n      \"Size\": 704\n    },\n    \"res/drawable/ic_m3_chip_checked_circle.xml\": {\n      \"Size\": 900\n    },\n    \"res/drawable/ic_m3_chip_close.xml\": {\n      \"Size\": 648\n    },\n    \"res/drawable/ic_mtrl_checked_circle.xml\": {\n      \"Size\": 672\n    },\n    \"res/drawable/ic_mtrl_chip_checked_black.xml\": {\n      \"Size\": 600\n    },\n    \"res/drawable/ic_mtrl_chip_checked_circle.xml\": {\n      \"Size\": 940\n    },\n    \"res/drawable/ic_mtrl_chip_close_circle.xml\": {\n      \"Size\": 808\n    },\n    \"res/drawable/ic_search_black_24.xml\": {\n      \"Size\": 800\n    },\n    \"res/drawable/m3_avd_hide_password.xml\": {\n      \"Size\": 660\n    },\n    \"res/drawable/m3_avd_show_password.xml\": {\n      \"Size\": 660\n    },\n    \"res/drawable/m3_bottom_sheet_drag_handle.xml\": {\n      \"Size\": 628\n    },\n    \"res/drawable/m3_password_eye.xml\": {\n      \"Size\": 816\n    },\n    \"res/drawable/m3_popupmenu_background_overlay.xml\": {\n      \"Size\": 740\n    },\n    \"res/drawable/m3_tabs_line_indicator.xml\": {\n      \"Size\": 480\n    },\n    \"res/drawable/m3_tabs_rounded_line_indicator.xml\": {\n      \"Size\": 956\n    },\n    \"res/drawable/material_ic_calendar_black_24dp.xml\": {\n      \"Size\": 696\n    },\n    \"res/drawable/material_ic_clear_black_24dp.xml\": {\n      \"Size\": 752\n    },\n    \"res/drawable/material_ic_edit_black_24dp.xml\": {\n      \"Size\": 716\n    },\n    \"res/drawable/material_ic_keyboard_arrow_left_black_24dp.xml\": {\n      \"Size\": 712\n    },\n    \"res/drawable/material_ic_keyboard_arrow_right_black_24dp.xml\": {\n      \"Size\": 700\n    },\n    \"res/drawable/material_ic_menu_arrow_down_black_24dp.xml\": {\n      \"Size\": 648\n    },\n    \"res/drawable/material_ic_menu_arrow_up_black_24dp.xml\": {\n      \"Size\": 648\n    },\n    \"res/drawable/maui_splash_image.xml\": {\n      \"Size\": 488\n    },\n    \"res/drawable/mtrl_bottomsheet_drag_handle.xml\": {\n      \"Size\": 628\n    },\n    \"res/drawable/mtrl_checkbox_button_checked_unchecked.xml\": {\n      \"Size\": 724\n    },\n    \"res/drawable/mtrl_checkbox_button_icon_checked_indeterminate.xml\": {\n      \"Size\": 524\n    },\n    \"res/drawable/mtrl_checkbox_button_icon_checked_unchecked.xml\": {\n      \"Size\": 724\n    },\n    \"res/drawable/mtrl_checkbox_button_icon_indeterminate_checked.xml\": {\n      \"Size\": 524\n    },\n    \"res/drawable/mtrl_checkbox_button_icon_indeterminate_unchecked.xml\": {\n      \"Size\": 724\n    },\n    \"res/drawable/mtrl_checkbox_button_icon_unchecked_checked.xml\": {\n      \"Size\": 724\n    },\n    \"res/drawable/mtrl_checkbox_button_icon_unchecked_indeterminate.xml\": {\n      \"Size\": 724\n    },\n    \"res/drawable/mtrl_checkbox_button_icon.xml\": {\n      \"Size\": 1572\n    },\n    \"res/drawable/mtrl_checkbox_button_unchecked_checked.xml\": {\n      \"Size\": 724\n    },\n    \"res/drawable/mtrl_checkbox_button.xml\": {\n      \"Size\": 1332\n    },\n    \"res/drawable/mtrl_dialog_background.xml\": {\n      \"Size\": 716\n    },\n    \"res/drawable/mtrl_dropdown_arrow.xml\": {\n      \"Size\": 464\n    },\n    \"res/drawable/mtrl_ic_arrow_drop_down.xml\": {\n      \"Size\": 564\n    },\n    \"res/drawable/mtrl_ic_arrow_drop_up.xml\": {\n      \"Size\": 564\n    },\n    \"res/drawable/mtrl_ic_cancel.xml\": {\n      \"Size\": 724\n    },\n    \"res/drawable/mtrl_ic_check_mark.xml\": {\n      \"Size\": 744\n    },\n    \"res/drawable/mtrl_ic_checkbox_checked.xml\": {\n      \"Size\": 904\n    },\n    \"res/drawable/mtrl_ic_checkbox_unchecked.xml\": {\n      \"Size\": 612\n    },\n    \"res/drawable/mtrl_ic_error.xml\": {\n      \"Size\": 644\n    },\n    \"res/drawable/mtrl_ic_indeterminate.xml\": {\n      \"Size\": 744\n    },\n    \"res/drawable/mtrl_popupmenu_background_overlay.xml\": {\n      \"Size\": 740\n    },\n    \"res/drawable/mtrl_popupmenu_background.xml\": {\n      \"Size\": 740\n    },\n    \"res/drawable/mtrl_switch_thumb_checked_pressed.xml\": {\n      \"Size\": 524\n    },\n    \"res/drawable/mtrl_switch_thumb_checked_unchecked.xml\": {\n      \"Size\": 784\n    },\n    \"res/drawable/mtrl_switch_thumb_checked.xml\": {\n      \"Size\": 744\n    },\n    \"res/drawable/mtrl_switch_thumb_pressed_checked.xml\": {\n      \"Size\": 524\n    },\n    \"res/drawable/mtrl_switch_thumb_pressed_unchecked.xml\": {\n      \"Size\": 524\n    },\n    \"res/drawable/mtrl_switch_thumb_pressed.xml\": {\n      \"Size\": 744\n    },\n    \"res/drawable/mtrl_switch_thumb_unchecked_checked.xml\": {\n      \"Size\": 784\n    },\n    \"res/drawable/mtrl_switch_thumb_unchecked_pressed.xml\": {\n      \"Size\": 524\n    },\n    \"res/drawable/mtrl_switch_thumb_unchecked.xml\": {\n      \"Size\": 744\n    },\n    \"res/drawable/mtrl_switch_thumb.xml\": {\n      \"Size\": 2004\n    },\n    \"res/drawable/mtrl_switch_track_decoration.xml\": {\n      \"Size\": 636\n    },\n    \"res/drawable/mtrl_switch_track.xml\": {\n      \"Size\": 588\n    },\n    \"res/drawable/mtrl_tabs_default_indicator.xml\": {\n      \"Size\": 628\n    },\n    \"res/drawable/navigation_empty_icon.xml\": {\n      \"Size\": 516\n    },\n    \"res/drawable/notification_bg_low.xml\": {\n      \"Size\": 532\n    },\n    \"res/drawable/notification_bg.xml\": {\n      \"Size\": 532\n    },\n    \"res/drawable/notification_icon_background.xml\": {\n      \"Size\": 372\n    },\n    \"res/drawable/notification_tile_bg.xml\": {\n      \"Size\": 304\n    },\n    \"res/drawable/test_level_drawable.xml\": {\n      \"Size\": 448\n    },\n    \"res/drawable/tooltip_frame_dark.xml\": {\n      \"Size\": 484\n    },\n    \"res/drawable/tooltip_frame_light.xml\": {\n      \"Size\": 484\n    },\n    \"res/interpolator-v21/m3_sys_motion_easing_emphasized_accelerate.xml\": {\n      \"Size\": 400\n    },\n    \"res/interpolator-v21/m3_sys_motion_easing_emphasized_decelerate.xml\": {\n      \"Size\": 400\n    },\n    \"res/interpolator-v21/m3_sys_motion_easing_emphasized.xml\": {\n      \"Size\": 280\n    },\n    \"res/interpolator-v21/m3_sys_motion_easing_linear.xml\": {\n      \"Size\": 400\n    },\n    \"res/interpolator-v21/m3_sys_motion_easing_standard_accelerate.xml\": {\n      \"Size\": 400\n    },\n    \"res/interpolator-v21/m3_sys_motion_easing_standard_decelerate.xml\": {\n      \"Size\": 400\n    },\n    \"res/interpolator-v21/m3_sys_motion_easing_standard.xml\": {\n      \"Size\": 400\n    },\n    \"res/interpolator-v21/mtrl_fast_out_linear_in.xml\": {\n      \"Size\": 400\n    },\n    \"res/interpolator-v21/mtrl_fast_out_slow_in.xml\": {\n      \"Size\": 400\n    },\n    \"res/interpolator-v21/mtrl_linear_out_slow_in.xml\": {\n      \"Size\": 400\n    },\n    \"res/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_0.xml\": {\n      \"Size\": 316\n    },\n    \"res/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_1.xml\": {\n      \"Size\": 328\n    },\n    \"res/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_0.xml\": {\n      \"Size\": 316\n    },\n    \"res/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_1.xml\": {\n      \"Size\": 328\n    },\n    \"res/interpolator/btn_radio_to_off_mtrl_animation_interpolator_0.xml\": {\n      \"Size\": 320\n    },\n    \"res/interpolator/btn_radio_to_on_mtrl_animation_interpolator_0.xml\": {\n      \"Size\": 320\n    },\n    \"res/interpolator/fast_out_slow_in.xml\": {\n      \"Size\": 400\n    },\n    \"res/interpolator/mtrl_linear.xml\": {\n      \"Size\": 132\n    },\n    \"res/layout-land/material_clock_period_toggle_land.xml\": {\n      \"Size\": 1232\n    },\n    \"res/layout-land/material_timepicker.xml\": {\n      \"Size\": 1676\n    },\n    \"res/layout-land/mtrl_picker_header_dialog.xml\": {\n      \"Size\": 1532\n    },\n    \"res/layout-sw600dp-v13/design_layout_snackbar.xml\": {\n      \"Size\": 528\n    },\n    \"res/layout-sw600dp-v13/mtrl_layout_snackbar.xml\": {\n      \"Size\": 492\n    },\n    \"res/layout-v21/notification_action_tombstone.xml\": {\n      \"Size\": 1228\n    },\n    \"res/layout-v21/notification_action.xml\": {\n      \"Size\": 1052\n    },\n    \"res/layout-v21/notification_template_custom_big.xml\": {\n      \"Size\": 2456\n    },\n    \"res/layout-v21/notification_template_icon_group.xml\": {\n      \"Size\": 988\n    },\n    \"res/layout-v22/abc_alert_dialog_button_bar_material.xml\": {\n      \"Size\": 1584\n    },\n    \"res/layout-v22/design_navigation_item.xml\": {\n      \"Size\": 636\n    },\n    \"res/layout-v22/m3_alert_dialog_actions.xml\": {\n      \"Size\": 1584\n    },\n    \"res/layout-v22/material_timepicker_dialog.xml\": {\n      \"Size\": 3184\n    },\n    \"res/layout-v22/mtrl_alert_dialog_actions.xml\": {\n      \"Size\": 1764\n    },\n    \"res/layout-v22/mtrl_search_view.xml\": {\n      \"Size\": 3424\n    },\n    \"res/layout-v26/abc_screen_toolbar.xml\": {\n      \"Size\": 1560\n    },\n    \"res/layout-v26/mtrl_calendar_month.xml\": {\n      \"Size\": 744\n    },\n    \"res/layout-watch-v20/abc_alert_dialog_button_bar_material.xml\": {\n      \"Size\": 1208\n    },\n    \"res/layout-watch-v20/abc_alert_dialog_title_material.xml\": {\n      \"Size\": 1352\n    },\n    \"res/layout/abc_action_bar_title_item.xml\": {\n      \"Size\": 872\n    },\n    \"res/layout/abc_action_bar_up_container.xml\": {\n      \"Size\": 440\n    },\n    \"res/layout/abc_action_menu_item_layout.xml\": {\n      \"Size\": 768\n    },\n    \"res/layout/abc_action_menu_layout.xml\": {\n      \"Size\": 576\n    },\n    \"res/layout/abc_action_mode_bar.xml\": {\n      \"Size\": 464\n    },\n    \"res/layout/abc_action_mode_close_item_material.xml\": {\n      \"Size\": 840\n    },\n    \"res/layout/abc_activity_chooser_view_list_item.xml\": {\n      \"Size\": 1304\n    },\n    \"res/layout/abc_activity_chooser_view.xml\": {\n      \"Size\": 1684\n    },\n    \"res/layout/abc_alert_dialog_button_bar_material.xml\": {\n      \"Size\": 1536\n    },\n    \"res/layout/abc_alert_dialog_material.xml\": {\n      \"Size\": 2648\n    },\n    \"res/layout/abc_alert_dialog_title_material.xml\": {\n      \"Size\": 1560\n    },\n    \"res/layout/abc_cascading_menu_item_layout.xml\": {\n      \"Size\": 1868\n    },\n    \"res/layout/abc_dialog_title_material.xml\": {\n      \"Size\": 1116\n    },\n    \"res/layout/abc_expanded_menu_layout.xml\": {\n      \"Size\": 388\n    },\n    \"res/layout/abc_list_menu_item_checkbox.xml\": {\n      \"Size\": 528\n    },\n    \"res/layout/abc_list_menu_item_icon.xml\": {\n      \"Size\": 780\n    },\n    \"res/layout/abc_list_menu_item_layout.xml\": {\n      \"Size\": 1396\n    },\n    \"res/layout/abc_list_menu_item_radio.xml\": {\n      \"Size\": 532\n    },\n    \"res/layout/abc_popup_menu_header_item_layout.xml\": {\n      \"Size\": 848\n    },\n    \"res/layout/abc_popup_menu_item_layout.xml\": {\n      \"Size\": 2072\n    },\n    \"res/layout/abc_screen_content_include.xml\": {\n      \"Size\": 548\n    },\n    \"res/layout/abc_screen_simple_overlay_action_mode.xml\": {\n      \"Size\": 792\n    },\n    \"res/layout/abc_screen_simple.xml\": {\n      \"Size\": 832\n    },\n    \"res/layout/abc_screen_toolbar.xml\": {\n      \"Size\": 1504\n    },\n    \"res/layout/abc_search_dropdown_item_icons_2line.xml\": {\n      \"Size\": 1916\n    },\n    \"res/layout/abc_search_view.xml\": {\n      \"Size\": 3472\n    },\n    \"res/layout/abc_select_dialog_material.xml\": {\n      \"Size\": 1020\n    },\n    \"res/layout/abc_tooltip.xml\": {\n      \"Size\": 1056\n    },\n    \"res/layout/custom_dialog.xml\": {\n      \"Size\": 612\n    },\n    \"res/layout/design_bottom_navigation_item.xml\": {\n      \"Size\": 1860\n    },\n    \"res/layout/design_bottom_sheet_dialog.xml\": {\n      \"Size\": 1224\n    },\n    \"res/layout/design_layout_snackbar_include.xml\": {\n      \"Size\": 1444\n    },\n    \"res/layout/design_layout_snackbar.xml\": {\n      \"Size\": 528\n    },\n    \"res/layout/design_layout_tab_icon.xml\": {\n      \"Size\": 408\n    },\n    \"res/layout/design_layout_tab_text.xml\": {\n      \"Size\": 436\n    },\n    \"res/layout/design_menu_item_action_area.xml\": {\n      \"Size\": 320\n    },\n    \"res/layout/design_navigation_item_header.xml\": {\n      \"Size\": 440\n    },\n    \"res/layout/design_navigation_item_separator.xml\": {\n      \"Size\": 472\n    },\n    \"res/layout/design_navigation_item_subheader.xml\": {\n      \"Size\": 564\n    },\n    \"res/layout/design_navigation_item.xml\": {\n      \"Size\": 576\n    },\n    \"res/layout/design_navigation_menu_item.xml\": {\n      \"Size\": 856\n    },\n    \"res/layout/design_navigation_menu.xml\": {\n      \"Size\": 528\n    },\n    \"res/layout/design_text_input_end_icon.xml\": {\n      \"Size\": 656\n    },\n    \"res/layout/design_text_input_start_icon.xml\": {\n      \"Size\": 652\n    },\n    \"res/layout/ime_base_split_test_activity.xml\": {\n      \"Size\": 364\n    },\n    \"res/layout/ime_secondary_split_test_activity.xml\": {\n      \"Size\": 876\n    },\n    \"res/layout/m3_alert_dialog_actions.xml\": {\n      \"Size\": 1536\n    },\n    \"res/layout/m3_alert_dialog_title.xml\": {\n      \"Size\": 956\n    },\n    \"res/layout/m3_alert_dialog.xml\": {\n      \"Size\": 2720\n    },\n    \"res/layout/m3_auto_complete_simple_item.xml\": {\n      \"Size\": 612\n    },\n    \"res/layout/m3_side_sheet_dialog.xml\": {\n      \"Size\": 1180\n    },\n    \"res/layout/material_chip_input_combo.xml\": {\n      \"Size\": 372\n    },\n    \"res/layout/material_clock_display_divider.xml\": {\n      \"Size\": 444\n    },\n    \"res/layout/material_clock_display.xml\": {\n      \"Size\": 796\n    },\n    \"res/layout/material_clock_period_toggle.xml\": {\n      \"Size\": 1220\n    },\n    \"res/layout/material_clockface_textview.xml\": {\n      \"Size\": 476\n    },\n    \"res/layout/material_clockface_view.xml\": {\n      \"Size\": 1012\n    },\n    \"res/layout/material_radial_view_group.xml\": {\n      \"Size\": 768\n    },\n    \"res/layout/material_textinput_timepicker.xml\": {\n      \"Size\": 720\n    },\n    \"res/layout/material_time_chip.xml\": {\n      \"Size\": 380\n    },\n    \"res/layout/material_time_input.xml\": {\n      \"Size\": 956\n    },\n    \"res/layout/material_timepicker_dialog.xml\": {\n      \"Size\": 3132\n    },\n    \"res/layout/material_timepicker_textinput_display.xml\": {\n      \"Size\": 728\n    },\n    \"res/layout/material_timepicker.xml\": {\n      \"Size\": 1608\n    },\n    \"res/layout/mtrl_alert_dialog_actions.xml\": {\n      \"Size\": 1620\n    },\n    \"res/layout/mtrl_alert_dialog_title.xml\": {\n      \"Size\": 956\n    },\n    \"res/layout/mtrl_alert_dialog.xml\": {\n      \"Size\": 2476\n    },\n    \"res/layout/mtrl_alert_select_dialog_item.xml\": {\n      \"Size\": 588\n    },\n    \"res/layout/mtrl_alert_select_dialog_multichoice.xml\": {\n      \"Size\": 940\n    },\n    \"res/layout/mtrl_alert_select_dialog_singlechoice.xml\": {\n      \"Size\": 940\n    },\n    \"res/layout/mtrl_auto_complete_simple_item.xml\": {\n      \"Size\": 612\n    },\n    \"res/layout/mtrl_calendar_day_of_week.xml\": {\n      \"Size\": 352\n    },\n    \"res/layout/mtrl_calendar_day.xml\": {\n      \"Size\": 352\n    },\n    \"res/layout/mtrl_calendar_days_of_week.xml\": {\n      \"Size\": 436\n    },\n    \"res/layout/mtrl_calendar_horizontal.xml\": {\n      \"Size\": 1176\n    },\n    \"res/layout/mtrl_calendar_month_labeled.xml\": {\n      \"Size\": 728\n    },\n    \"res/layout/mtrl_calendar_month_navigation.xml\": {\n      \"Size\": 1748\n    },\n    \"res/layout/mtrl_calendar_month.xml\": {\n      \"Size\": 688\n    },\n    \"res/layout/mtrl_calendar_months.xml\": {\n      \"Size\": 428\n    },\n    \"res/layout/mtrl_calendar_vertical.xml\": {\n      \"Size\": 740\n    },\n    \"res/layout/mtrl_calendar_year.xml\": {\n      \"Size\": 352\n    },\n    \"res/layout/mtrl_layout_snackbar_include.xml\": {\n      \"Size\": 952\n    },\n    \"res/layout/mtrl_layout_snackbar.xml\": {\n      \"Size\": 492\n    },\n    \"res/layout/mtrl_navigation_rail_item.xml\": {\n      \"Size\": 1860\n    },\n    \"res/layout/mtrl_picker_actions.xml\": {\n      \"Size\": 984\n    },\n    \"res/layout/mtrl_picker_dialog.xml\": {\n      \"Size\": 1172\n    },\n    \"res/layout/mtrl_picker_fullscreen.xml\": {\n      \"Size\": 880\n    },\n    \"res/layout/mtrl_picker_header_dialog.xml\": {\n      \"Size\": 1492\n    },\n    \"res/layout/mtrl_picker_header_fullscreen.xml\": {\n      \"Size\": 2800\n    },\n    \"res/layout/mtrl_picker_header_selection_text.xml\": {\n      \"Size\": 712\n    },\n    \"res/layout/mtrl_picker_header_title_text.xml\": {\n      \"Size\": 624\n    },\n    \"res/layout/mtrl_picker_header_toggle.xml\": {\n      \"Size\": 528\n    },\n    \"res/layout/mtrl_picker_text_input_date_range.xml\": {\n      \"Size\": 1580\n    },\n    \"res/layout/mtrl_picker_text_input_date.xml\": {\n      \"Size\": 984\n    },\n    \"res/layout/mtrl_search_bar.xml\": {\n      \"Size\": 488\n    },\n    \"res/layout/mtrl_search_view.xml\": {\n      \"Size\": 3376\n    },\n    \"res/layout/notification_template_part_chronometer.xml\": {\n      \"Size\": 440\n    },\n    \"res/layout/notification_template_part_time.xml\": {\n      \"Size\": 440\n    },\n    \"res/layout/select_dialog_item_material.xml\": {\n      \"Size\": 640\n    },\n    \"res/layout/select_dialog_multichoice_material.xml\": {\n      \"Size\": 864\n    },\n    \"res/layout/select_dialog_singlechoice_material.xml\": {\n      \"Size\": 864\n    },\n    \"res/layout/support_simple_spinner_dropdown_item.xml\": {\n      \"Size\": 464\n    },\n    \"res/mipmap-anydpi-v26/appicon_round.xml\": {\n      \"Size\": 548\n    },\n    \"res/mipmap-anydpi-v26/appicon.xml\": {\n      \"Size\": 548\n    },\n    \"res/mipmap-hdpi-v4/appicon_background.png\": {\n      \"Size\": 120\n    },\n    \"res/mipmap-hdpi-v4/appicon_foreground.png\": {\n      \"Size\": 1243\n    },\n    \"res/mipmap-hdpi-v4/appicon_round.png\": {\n      \"Size\": 1734\n    },\n    \"res/mipmap-hdpi-v4/appicon.png\": {\n      \"Size\": 1073\n    },\n    \"res/mipmap-mdpi-v4/appicon_background.png\": {\n      \"Size\": 106\n    },\n    \"res/mipmap-mdpi-v4/appicon_foreground.png\": {\n      \"Size\": 1129\n    },\n    \"res/mipmap-mdpi-v4/appicon_round.png\": {\n      \"Size\": 1523\n    },\n    \"res/mipmap-mdpi-v4/appicon.png\": {\n      \"Size\": 741\n    },\n    \"res/mipmap-xhdpi-v4/appicon_background.png\": {\n      \"Size\": 140\n    },\n    \"res/mipmap-xhdpi-v4/appicon_foreground.png\": {\n      \"Size\": 1723\n    },\n    \"res/mipmap-xhdpi-v4/appicon_round.png\": {\n      \"Size\": 2030\n    },\n    \"res/mipmap-xhdpi-v4/appicon.png\": {\n      \"Size\": 875\n    },\n    \"res/mipmap-xxhdpi-v4/appicon_background.png\": {\n      \"Size\": 197\n    },\n    \"res/mipmap-xxhdpi-v4/appicon_foreground.png\": {\n      \"Size\": 2142\n    },\n    \"res/mipmap-xxhdpi-v4/appicon_round.png\": {\n      \"Size\": 4317\n    },\n    \"res/mipmap-xxhdpi-v4/appicon.png\": {\n      \"Size\": 1336\n    },\n    \"res/mipmap-xxxhdpi-v4/appicon_background.png\": {\n      \"Size\": 275\n    },\n    \"res/mipmap-xxxhdpi-v4/appicon_foreground.png\": {\n      \"Size\": 3023\n    },\n    \"res/mipmap-xxxhdpi-v4/appicon_round.png\": {\n      \"Size\": 5567\n    },\n    \"res/mipmap-xxxhdpi-v4/appicon.png\": {\n      \"Size\": 1455\n    },\n    \"res/xml/splits0.xml\": {\n      \"Size\": 8404\n    },\n    \"resources.arsc\": {\n      \"Size\": 1041556\n    }\n  },\n  \"PackageSize\": 9219903\n}"
  },
  {
    "path": "sizes/com.companyname.HelloBlazor-Signed.apkdesc",
    "content": "{\n  \"Comment\": null,\n  \"Entries\": {\n    \"AndroidManifest.xml\": {\n      \"Size\": 6364\n    },\n    \"assets/wwwroot/_framework/blazor.modules.json\": {\n      \"Size\": 4\n    },\n    \"assets/wwwroot/_framework/blazor.webview.js\": {\n      \"Size\": 441485\n    },\n    \"assets/wwwroot/css/app.css\": {\n      \"Size\": 3111\n    },\n    \"assets/wwwroot/css/bootstrap/bootstrap.min.css\": {\n      \"Size\": 162720\n    },\n    \"assets/wwwroot/css/bootstrap/bootstrap.min.css.map\": {\n      \"Size\": 449111\n    },\n    \"assets/wwwroot/css/open-iconic/FONT-LICENSE\": {\n      \"Size\": 4017\n    },\n    \"assets/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css\": {\n      \"Size\": 9395\n    },\n    \"assets/wwwroot/css/open-iconic/font/fonts/open-iconic.eot\": {\n      \"Size\": 28196\n    },\n    \"assets/wwwroot/css/open-iconic/font/fonts/open-iconic.otf\": {\n      \"Size\": 20996\n    },\n    \"assets/wwwroot/css/open-iconic/font/fonts/open-iconic.svg\": {\n      \"Size\": 54789\n    },\n    \"assets/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf\": {\n      \"Size\": 28028\n    },\n    \"assets/wwwroot/css/open-iconic/font/fonts/open-iconic.woff\": {\n      \"Size\": 14984\n    },\n    \"assets/wwwroot/css/open-iconic/ICON-LICENSE\": {\n      \"Size\": 1073\n    },\n    \"assets/wwwroot/css/open-iconic/README.md\": {\n      \"Size\": 3544\n    },\n    \"assets/wwwroot/favicon.ico\": {\n      \"Size\": 5430\n    },\n    \"assets/wwwroot/HelloBlazor.5vi0tj9vah.bundle.scp.css\": {\n      \"Size\": 2826\n    },\n    \"assets/wwwroot/HelloBlazor.styles.css\": {\n      \"Size\": 2826\n    },\n    \"assets/wwwroot/index.html\": {\n      \"Size\": 790\n    },\n    \"classes.dex\": {\n      \"Size\": 9872948\n    },\n    \"classes2.dex\": {\n      \"Size\": 239516\n    },\n    \"commonMain/default/linkdata/module\": {\n      \"Size\": 281\n    },\n    \"commonMain/default/linkdata/package_androidx.annotation/0_annotation.knm\": {\n      \"Size\": 4603\n    },\n    \"commonMain/default/linkdata/package_androidx.collection.internal/0_internal.knm\": {\n      \"Size\": 697\n    },\n    \"commonMain/default/linkdata/package_androidx.collection.internal/1_internal.knm\": {\n      \"Size\": 871\n    },\n    \"commonMain/default/linkdata/package_androidx.collection/0_collection.knm\": {\n      \"Size\": 50326\n    },\n    \"commonMain/default/linkdata/package_androidx.collection/1_collection.knm\": {\n      \"Size\": 124\n    },\n    \"commonMain/default/linkdata/package_androidx.collection/2_collection.knm\": {\n      \"Size\": 6895\n    },\n    \"commonMain/default/linkdata/package_androidx.collection/3_collection.knm\": {\n      \"Size\": 6451\n    },\n    \"commonMain/default/linkdata/package_androidx.collection/4_collection.knm\": {\n      \"Size\": 6604\n    },\n    \"commonMain/default/linkdata/package_androidx.collection/5_collection.knm\": {\n      \"Size\": 3642\n    },\n    \"commonMain/default/linkdata/package_androidx/0_androidx.knm\": {\n      \"Size\": 20\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.channels/0_channels.knm\": {\n      \"Size\": 16032\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.channels/1_channels.knm\": {\n      \"Size\": 8842\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.flow.internal/0_internal.knm\": {\n      \"Size\": 5146\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.flow.internal/1_internal.knm\": {\n      \"Size\": 1942\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.flow/0_flow.knm\": {\n      \"Size\": 8434\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.flow/1_flow.knm\": {\n      \"Size\": 12759\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.flow/2_flow.knm\": {\n      \"Size\": 9008\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.internal/0_internal.knm\": {\n      \"Size\": 10333\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.internal/1_internal.knm\": {\n      \"Size\": 3585\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.intrinsics/0_intrinsics.knm\": {\n      \"Size\": 1266\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.selects/0_selects.knm\": {\n      \"Size\": 6768\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.selects/1_selects.knm\": {\n      \"Size\": 1849\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.sync/0_sync.knm\": {\n      \"Size\": 4469\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines.sync/1_sync.knm\": {\n      \"Size\": 1040\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines/0_coroutines.knm\": {\n      \"Size\": 23712\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines/1_coroutines.knm\": {\n      \"Size\": 5292\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines/2_coroutines.knm\": {\n      \"Size\": 6947\n    },\n    \"commonMain/default/linkdata/package_kotlinx.coroutines/3_coroutines.knm\": {\n      \"Size\": 816\n    },\n    \"commonMain/default/linkdata/package_kotlinx/0_kotlinx.knm\": {\n      \"Size\": 19\n    },\n    \"commonMain/default/linkdata/root_package/0_.knm\": {\n      \"Size\": 12\n    },\n    \"commonMain/default/manifest\": {\n      \"Size\": 138\n    },\n    \"concurrentMain/default/linkdata/module\": {\n      \"Size\": 142\n    },\n    \"concurrentMain/default/linkdata/package_kotlinx.coroutines.channels/0_channels.knm\": {\n      \"Size\": 645\n    },\n    \"concurrentMain/default/linkdata/package_kotlinx.coroutines.internal/0_internal.knm\": {\n      \"Size\": 2230\n    },\n    \"concurrentMain/default/linkdata/package_kotlinx.coroutines.internal/1_internal.knm\": {\n      \"Size\": 491\n    },\n    \"concurrentMain/default/linkdata/package_kotlinx.coroutines/0_coroutines.knm\": {\n      \"Size\": 503\n    },\n    \"concurrentMain/default/linkdata/package_kotlinx.coroutines/1_coroutines.knm\": {\n      \"Size\": 1080\n    },\n    \"concurrentMain/default/linkdata/package_kotlinx/0_kotlinx.knm\": {\n      \"Size\": 19\n    },\n    \"concurrentMain/default/linkdata/root_package/0_.knm\": {\n      \"Size\": 12\n    },\n    \"concurrentMain/default/manifest\": {\n      \"Size\": 142\n    },\n    \"kotlin/annotation/annotation.kotlin_builtins\": {\n      \"Size\": 928\n    },\n    \"kotlin/collections/collections.kotlin_builtins\": {\n      \"Size\": 3685\n    },\n    \"kotlin/coroutines/coroutines.kotlin_builtins\": {\n      \"Size\": 200\n    },\n    \"kotlin/internal/internal.kotlin_builtins\": {\n      \"Size\": 646\n    },\n    \"kotlin/kotlin.kotlin_builtins\": {\n      \"Size\": 18640\n    },\n    \"kotlin/ranges/ranges.kotlin_builtins\": {\n      \"Size\": 3399\n    },\n    \"kotlin/reflect/reflect.kotlin_builtins\": {\n      \"Size\": 2426\n    },\n    \"lib/arm64-v8a/libaot-_Microsoft.Android.Resource.Designer.dll.so\": {\n      \"Size\": 3800\n    },\n    \"lib/arm64-v8a/libaot-CommunityToolkit.Mvvm.dll.so\": {\n      \"Size\": 4368\n    },\n    \"lib/arm64-v8a/libaot-HelloBlazor.dll.so\": {\n      \"Size\": 15464\n    },\n    \"lib/arm64-v8a/libaot-Java.Interop.dll.so\": {\n      \"Size\": 168720\n    },\n    \"lib/arm64-v8a/libaot-Microsoft.AspNetCore.Components.dll.so\": {\n      \"Size\": 208152\n    },\n    \"lib/arm64-v8a/libaot-Microsoft.AspNetCore.Components.Web.dll.so\": {\n      \"Size\": 19008\n    },\n    \"lib/arm64-v8a/libaot-Microsoft.AspNetCore.Components.WebView.dll.so\": {\n      \"Size\": 90248\n    },\n    \"lib/arm64-v8a/libaot-Microsoft.Extensions.DependencyInjection.Abstractions.dll.so\": {\n      \"Size\": 16008\n    },\n    \"lib/arm64-v8a/libaot-Microsoft.Extensions.DependencyInjection.dll.so\": {\n      \"Size\": 59344\n    },\n    \"lib/arm64-v8a/libaot-Microsoft.Extensions.FileProviders.Abstractions.dll.so\": {\n      \"Size\": 4416\n    },\n    \"lib/arm64-v8a/libaot-Microsoft.Extensions.FileProviders.Composite.dll.so\": {\n      \"Size\": 3824\n    },\n    \"lib/arm64-v8a/libaot-Microsoft.Extensions.FileProviders.Physical.dll.so\": {\n      \"Size\": 4592\n    },\n    \"lib/arm64-v8a/libaot-Microsoft.Extensions.FileSystemGlobbing.dll.so\": {\n      \"Size\": 8432\n    },\n    \"lib/arm64-v8a/libaot-Microsoft.Extensions.Logging.Abstractions.dll.so\": {\n      \"Size\": 51480\n    },\n    \"lib/arm64-v8a/libaot-Microsoft.Extensions.Logging.dll.so\": {\n      \"Size\": 20360\n    },\n    \"lib/arm64-v8a/libaot-Microsoft.Extensions.Options.dll.so\": {\n      \"Size\": 29752\n    },\n    \"lib/arm64-v8a/libaot-Microsoft.Extensions.Primitives.dll.so\": {\n      \"Size\": 12880\n    },\n    \"lib/arm64-v8a/libaot-Microsoft.JSInterop.dll.so\": {\n      \"Size\": 53224\n    },\n    \"lib/arm64-v8a/libaot-Microsoft.Maui.Graphics.dll.so\": {\n      \"Size\": 3848\n    },\n    \"lib/arm64-v8a/libaot-Mono.Android.dll.so\": {\n      \"Size\": 313144\n    },\n    \"lib/arm64-v8a/libaot-Mono.Android.Runtime.dll.so\": {\n      \"Size\": 4480\n    },\n    \"lib/arm64-v8a/libaot-Spice.dll.so\": {\n      \"Size\": 56696\n    },\n    \"lib/arm64-v8a/libaot-System.Collections.Concurrent.dll.so\": {\n      \"Size\": 47528\n    },\n    \"lib/arm64-v8a/libaot-System.Collections.dll.so\": {\n      \"Size\": 45240\n    },\n    \"lib/arm64-v8a/libaot-System.Collections.Immutable.dll.so\": {\n      \"Size\": 108928\n    },\n    \"lib/arm64-v8a/libaot-System.ComponentModel.dll.so\": {\n      \"Size\": 3656\n    },\n    \"lib/arm64-v8a/libaot-System.ComponentModel.Primitives.dll.so\": {\n      \"Size\": 4312\n    },\n    \"lib/arm64-v8a/libaot-System.ComponentModel.TypeConverter.dll.so\": {\n      \"Size\": 3872\n    },\n    \"lib/arm64-v8a/libaot-System.Console.dll.so\": {\n      \"Size\": 4912\n    },\n    \"lib/arm64-v8a/libaot-System.Diagnostics.DiagnosticSource.dll.so\": {\n      \"Size\": 29736\n    },\n    \"lib/arm64-v8a/libaot-System.dll.so\": {\n      \"Size\": 3592\n    },\n    \"lib/arm64-v8a/libaot-System.IO.FileSystem.Watcher.dll.so\": {\n      \"Size\": 6752\n    },\n    \"lib/arm64-v8a/libaot-System.IO.Pipelines.dll.so\": {\n      \"Size\": 3808\n    },\n    \"lib/arm64-v8a/libaot-System.Linq.dll.so\": {\n      \"Size\": 96256\n    },\n    \"lib/arm64-v8a/libaot-System.Linq.Expressions.dll.so\": {\n      \"Size\": 127432\n    },\n    \"lib/arm64-v8a/libaot-System.Memory.dll.so\": {\n      \"Size\": 29448\n    },\n    \"lib/arm64-v8a/libaot-System.ObjectModel.dll.so\": {\n      \"Size\": 12008\n    },\n    \"lib/arm64-v8a/libaot-System.Private.CoreLib.dll.so\": {\n      \"Size\": 1422992\n    },\n    \"lib/arm64-v8a/libaot-System.Private.Uri.dll.so\": {\n      \"Size\": 90360\n    },\n    \"lib/arm64-v8a/libaot-System.Runtime.dll.so\": {\n      \"Size\": 3608\n    },\n    \"lib/arm64-v8a/libaot-System.Runtime.InteropServices.dll.so\": {\n      \"Size\": 3640\n    },\n    \"lib/arm64-v8a/libaot-System.Security.Cryptography.dll.so\": {\n      \"Size\": 4160\n    },\n    \"lib/arm64-v8a/libaot-System.Text.Encodings.Web.dll.so\": {\n      \"Size\": 22392\n    },\n    \"lib/arm64-v8a/libaot-System.Text.Json.dll.so\": {\n      \"Size\": 308424\n    },\n    \"lib/arm64-v8a/libaot-System.Text.RegularExpressions.dll.so\": {\n      \"Size\": 190800\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.AndroidX.Activity.dll.so\": {\n      \"Size\": 9184\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.AndroidX.AppCompat.dll.so\": {\n      \"Size\": 29384\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.AndroidX.Core.dll.so\": {\n      \"Size\": 14848\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.AndroidX.DrawerLayout.dll.so\": {\n      \"Size\": 7680\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.AndroidX.Fragment.dll.so\": {\n      \"Size\": 18128\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.AndroidX.Lifecycle.Common.dll.so\": {\n      \"Size\": 5080\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.AndroidX.Lifecycle.LiveData.Core.dll.so\": {\n      \"Size\": 5072\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.AndroidX.Lifecycle.ViewModel.dll.so\": {\n      \"Size\": 6312\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.AndroidX.Loader.dll.so\": {\n      \"Size\": 6872\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.AndroidX.SavedState.dll.so\": {\n      \"Size\": 4376\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.Kotlin.StdLib.dll.so\": {\n      \"Size\": 5736\n    },\n    \"lib/arm64-v8a/libaot-Xamarin.KotlinX.Coroutines.Core.Jvm.dll.so\": {\n      \"Size\": 4992\n    },\n    \"lib/arm64-v8a/libarc.bin.so\": {\n      \"Size\": 19168\n    },\n    \"lib/arm64-v8a/libassembly-store.so\": {\n      \"Size\": 2534728\n    },\n    \"lib/arm64-v8a/libmono-component-marshal-ilgen.so\": {\n      \"Size\": 36616\n    },\n    \"lib/arm64-v8a/libmonodroid.so\": {\n      \"Size\": 1408384\n    },\n    \"lib/arm64-v8a/libmonosgen-2.0.so\": {\n      \"Size\": 3123272\n    },\n    \"lib/arm64-v8a/libSystem.Globalization.Native.so\": {\n      \"Size\": 71936\n    },\n    \"lib/arm64-v8a/libSystem.IO.Compression.Native.so\": {\n      \"Size\": 758968\n    },\n    \"lib/arm64-v8a/libSystem.Native.so\": {\n      \"Size\": 104064\n    },\n    \"lib/arm64-v8a/libSystem.Security.Cryptography.Native.Android.so\": {\n      \"Size\": 165536\n    },\n    \"lib/arm64-v8a/libxamarin-app.so\": {\n      \"Size\": 76608\n    },\n    \"META-INF/androidx.activity_activity.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.annotation_annotation-experimental.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.appcompat_appcompat-resources.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.appcompat_appcompat.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.arch.core_core-runtime.version\": {\n      \"Size\": 67\n    },\n    \"META-INF/androidx.cardview_cardview.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.coordinatorlayout_coordinatorlayout.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.core_core-ktx.version\": {\n      \"Size\": 7\n    },\n    \"META-INF/androidx.core_core.version\": {\n      \"Size\": 7\n    },\n    \"META-INF/androidx.cursoradapter_cursoradapter.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.customview_customview-poolingcontainer.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.customview_customview.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.documentfile_documentfile.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.drawerlayout_drawerlayout.version\": {\n      \"Size\": 70\n    },\n    \"META-INF/androidx.dynamicanimation_dynamicanimation.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.emoji2_emoji2-views-helper.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.emoji2_emoji2.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.fragment_fragment.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.interpolator_interpolator.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.legacy_legacy-support-core-utils.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.lifecycle_lifecycle-livedata-core.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.lifecycle_lifecycle-process.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.lifecycle_lifecycle-runtime.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.lifecycle_lifecycle-viewmodel-savedstate.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.lifecycle_lifecycle-viewmodel.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.loader_loader.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.localbroadcastmanager_localbroadcastmanager.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.print_print.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.profileinstaller_profileinstaller.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.recyclerview_recyclerview.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.savedstate_savedstate.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.startup_startup-runtime.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.swiperefreshlayout_swiperefreshlayout.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.tracing_tracing.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.transition_transition.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.vectordrawable_vectordrawable-animated.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.vectordrawable_vectordrawable.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.versionedparcelable_versionedparcelable.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.viewpager_viewpager.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/androidx.viewpager2_viewpager2.version\": {\n      \"Size\": 6\n    },\n    \"META-INF/BNDLTOOL.RSA\": {\n      \"Size\": 1605\n    },\n    \"META-INF/BNDLTOOL.SF\": {\n      \"Size\": 129295\n    },\n    \"META-INF/com.android.tools/proguard/coroutines.pro\": {\n      \"Size\": 1345\n    },\n    \"META-INF/com.android.tools/r8-from-1.6.0/coroutines.pro\": {\n      \"Size\": 899\n    },\n    \"META-INF/com.android.tools/r8-upto-3.0.0/coroutines.pro\": {\n      \"Size\": 558\n    },\n    \"META-INF/com.android.tools/r8/coroutines.pro\": {\n      \"Size\": 1190\n    },\n    \"META-INF/com.google.android.material_material.version\": {\n      \"Size\": 7\n    },\n    \"META-INF/kotlin-project-structure-metadata.json\": {\n      \"Size\": 9945\n    },\n    \"META-INF/kotlinx_coroutines_android.version\": {\n      \"Size\": 5\n    },\n    \"META-INF/kotlinx_coroutines_core.version\": {\n      \"Size\": 5\n    },\n    \"META-INF/MANIFEST.MF\": {\n      \"Size\": 129168\n    },\n    \"META-INF/maven/com.google.errorprone/error_prone_annotations/pom.properties\": {\n      \"Size\": 80\n    },\n    \"META-INF/maven/com.google.errorprone/error_prone_annotations/pom.xml\": {\n      \"Size\": 4252\n    },\n    \"META-INF/maven/com.google.guava/listenablefuture/pom.properties\": {\n      \"Size\": 96\n    },\n    \"META-INF/maven/com.google.guava/listenablefuture/pom.xml\": {\n      \"Size\": 2226\n    },\n    \"META-INF/proguard/androidx-annotations.pro\": {\n      \"Size\": 433\n    },\n    \"META-INF/proguard/coroutines.pro\": {\n      \"Size\": 1363\n    },\n    \"META-INF/services/kotlinx.coroutines.CoroutineExceptionHandler\": {\n      \"Size\": 54\n    },\n    \"META-INF/services/kotlinx.coroutines.internal.MainDispatcherFactory\": {\n      \"Size\": 52\n    },\n    \"nativeMain/default/linkdata/module\": {\n      \"Size\": 215\n    },\n    \"nativeMain/default/linkdata/package_androidx.collection.internal/0_internal.knm\": {\n      \"Size\": 1212\n    },\n    \"nativeMain/default/linkdata/package_androidx.collection.internal/1_internal.knm\": {\n      \"Size\": 289\n    },\n    \"nativeMain/default/linkdata/package_androidx.collection/0_collection.knm\": {\n      \"Size\": 3156\n    },\n    \"nativeMain/default/linkdata/package_androidx/0_androidx.knm\": {\n      \"Size\": 20\n    },\n    \"nativeMain/default/linkdata/package_kotlinx.coroutines.flow.internal/0_internal.knm\": {\n      \"Size\": 734\n    },\n    \"nativeMain/default/linkdata/package_kotlinx.coroutines.flow/0_flow.knm\": {\n      \"Size\": 35\n    },\n    \"nativeMain/default/linkdata/package_kotlinx.coroutines.internal/0_internal.knm\": {\n      \"Size\": 2373\n    },\n    \"nativeMain/default/linkdata/package_kotlinx.coroutines.internal/1_internal.knm\": {\n      \"Size\": 1617\n    },\n    \"nativeMain/default/linkdata/package_kotlinx.coroutines/0_coroutines.knm\": {\n      \"Size\": 4024\n    },\n    \"nativeMain/default/linkdata/package_kotlinx.coroutines/1_coroutines.knm\": {\n      \"Size\": 1893\n    },\n    \"nativeMain/default/linkdata/package_kotlinx/0_kotlinx.knm\": {\n      \"Size\": 19\n    },\n    \"nativeMain/default/linkdata/root_package/0_.knm\": {\n      \"Size\": 12\n    },\n    \"nativeMain/default/manifest\": {\n      \"Size\": 248\n    },\n    \"nativeOtherMain/default/linkdata/module\": {\n      \"Size\": 107\n    },\n    \"nativeOtherMain/default/linkdata/package_kotlinx.coroutines/0_coroutines.knm\": {\n      \"Size\": 645\n    },\n    \"nativeOtherMain/default/linkdata/package_kotlinx.coroutines/1_coroutines.knm\": {\n      \"Size\": 347\n    },\n    \"nativeOtherMain/default/linkdata/package_kotlinx/0_kotlinx.knm\": {\n      \"Size\": 19\n    },\n    \"nativeOtherMain/default/linkdata/root_package/0_.knm\": {\n      \"Size\": 12\n    },\n    \"nativeOtherMain/default/manifest\": {\n      \"Size\": 258\n    },\n    \"nonJvmMain/default/linkdata/module\": {\n      \"Size\": 90\n    },\n    \"nonJvmMain/default/linkdata/package_androidx.annotation/0_annotation.knm\": {\n      \"Size\": 991\n    },\n    \"nonJvmMain/default/linkdata/package_androidx/0_androidx.knm\": {\n      \"Size\": 20\n    },\n    \"nonJvmMain/default/linkdata/root_package/0_.knm\": {\n      \"Size\": 12\n    },\n    \"nonJvmMain/default/manifest\": {\n      \"Size\": 193\n    },\n    \"res/anim-v21/design_bottom_sheet_slide_in.xml\": {\n      \"Size\": 616\n    },\n    \"res/anim-v21/design_bottom_sheet_slide_out.xml\": {\n      \"Size\": 616\n    },\n    \"res/anim-v21/fragment_fast_out_extra_slow_in.xml\": {\n      \"Size\": 364\n    },\n    \"res/anim-v21/m3_bottom_sheet_slide_in.xml\": {\n      \"Size\": 616\n    },\n    \"res/anim-v21/m3_bottom_sheet_slide_out.xml\": {\n      \"Size\": 656\n    },\n    \"res/anim-v21/m3_side_sheet_enter_from_left.xml\": {\n      \"Size\": 464\n    },\n    \"res/anim-v21/m3_side_sheet_enter_from_right.xml\": {\n      \"Size\": 464\n    },\n    \"res/anim-v21/m3_side_sheet_exit_to_left.xml\": {\n      \"Size\": 464\n    },\n    \"res/anim-v21/m3_side_sheet_exit_to_right.xml\": {\n      \"Size\": 464\n    },\n    \"res/anim-v21/mtrl_bottom_sheet_slide_in.xml\": {\n      \"Size\": 616\n    },\n    \"res/anim-v21/mtrl_bottom_sheet_slide_out.xml\": {\n      \"Size\": 616\n    },\n    \"res/anim/abc_fade_in.xml\": {\n      \"Size\": 388\n    },\n    \"res/anim/abc_fade_out.xml\": {\n      \"Size\": 388\n    },\n    \"res/anim/abc_grow_fade_in_from_bottom.xml\": {\n      \"Size\": 852\n    },\n    \"res/anim/abc_popup_enter.xml\": {\n      \"Size\": 508\n    },\n    \"res/anim/abc_popup_exit.xml\": {\n      \"Size\": 508\n    },\n    \"res/anim/abc_shrink_fade_out_from_bottom.xml\": {\n      \"Size\": 852\n    },\n    \"res/anim/abc_slide_in_bottom.xml\": {\n      \"Size\": 396\n    },\n    \"res/anim/abc_slide_in_top.xml\": {\n      \"Size\": 396\n    },\n    \"res/anim/abc_slide_out_bottom.xml\": {\n      \"Size\": 396\n    },\n    \"res/anim/abc_slide_out_top.xml\": {\n      \"Size\": 396\n    },\n    \"res/anim/abc_tooltip_enter.xml\": {\n      \"Size\": 388\n    },\n    \"res/anim/abc_tooltip_exit.xml\": {\n      \"Size\": 388\n    },\n    \"res/anim/btn_checkbox_to_checked_box_inner_merged_animation.xml\": {\n      \"Size\": 2124\n    },\n    \"res/anim/btn_checkbox_to_checked_box_outer_merged_animation.xml\": {\n      \"Size\": 2780\n    },\n    \"res/anim/btn_checkbox_to_checked_icon_null_animation.xml\": {\n      \"Size\": 1196\n    },\n    \"res/anim/btn_checkbox_to_unchecked_box_inner_merged_animation.xml\": {\n      \"Size\": 2360\n    },\n    \"res/anim/btn_checkbox_to_unchecked_check_path_merged_animation.xml\": {\n      \"Size\": 2520\n    },\n    \"res/anim/btn_checkbox_to_unchecked_icon_null_animation.xml\": {\n      \"Size\": 1196\n    },\n    \"res/anim/btn_radio_to_off_mtrl_dot_group_animation.xml\": {\n      \"Size\": 1656\n    },\n    \"res/anim/btn_radio_to_off_mtrl_ring_outer_animation.xml\": {\n      \"Size\": 1656\n    },\n    \"res/anim/btn_radio_to_off_mtrl_ring_outer_path_animation.xml\": {\n      \"Size\": 1028\n    },\n    \"res/anim/btn_radio_to_on_mtrl_dot_group_animation.xml\": {\n      \"Size\": 1656\n    },\n    \"res/anim/btn_radio_to_on_mtrl_ring_outer_animation.xml\": {\n      \"Size\": 1656\n    },\n    \"res/anim/btn_radio_to_on_mtrl_ring_outer_path_animation.xml\": {\n      \"Size\": 1028\n    },\n    \"res/anim/design_snackbar_in.xml\": {\n      \"Size\": 312\n    },\n    \"res/anim/design_snackbar_out.xml\": {\n      \"Size\": 312\n    },\n    \"res/anim/linear_indeterminate_line1_head_interpolator.xml\": {\n      \"Size\": 400\n    },\n    \"res/anim/linear_indeterminate_line1_tail_interpolator.xml\": {\n      \"Size\": 400\n    },\n    \"res/anim/linear_indeterminate_line2_head_interpolator.xml\": {\n      \"Size\": 400\n    },\n    \"res/anim/linear_indeterminate_line2_tail_interpolator.xml\": {\n      \"Size\": 400\n    },\n    \"res/anim/m3_motion_fade_enter.xml\": {\n      \"Size\": 812\n    },\n    \"res/anim/m3_motion_fade_exit.xml\": {\n      \"Size\": 508\n    },\n    \"res/anim/mtrl_card_lowers_interpolator.xml\": {\n      \"Size\": 400\n    },\n    \"res/animator-v21/design_appbar_state_list_animator.xml\": {\n      \"Size\": 1216\n    },\n    \"res/animator-v21/m3_appbar_state_list_animator.xml\": {\n      \"Size\": 1216\n    },\n    \"res/animator/design_fab_hide_motion_spec.xml\": {\n      \"Size\": 796\n    },\n    \"res/animator/design_fab_show_motion_spec.xml\": {\n      \"Size\": 796\n    },\n    \"res/animator/fragment_close_enter.xml\": {\n      \"Size\": 1128\n    },\n    \"res/animator/fragment_close_exit.xml\": {\n      \"Size\": 1128\n    },\n    \"res/animator/fragment_fade_enter.xml\": {\n      \"Size\": 452\n    },\n    \"res/animator/fragment_fade_exit.xml\": {\n      \"Size\": 452\n    },\n    \"res/animator/fragment_open_enter.xml\": {\n      \"Size\": 1128\n    },\n    \"res/animator/fragment_open_exit.xml\": {\n      \"Size\": 1128\n    },\n    \"res/animator/m3_btn_elevated_btn_state_list_anim.xml\": {\n      \"Size\": 1796\n    },\n    \"res/animator/m3_btn_state_list_anim.xml\": {\n      \"Size\": 1796\n    },\n    \"res/animator/m3_card_elevated_state_list_anim.xml\": {\n      \"Size\": 1632\n    },\n    \"res/animator/m3_card_state_list_anim.xml\": {\n      \"Size\": 1584\n    },\n    \"res/animator/m3_chip_state_list_anim.xml\": {\n      \"Size\": 1180\n    },\n    \"res/animator/m3_elevated_chip_state_list_anim.xml\": {\n      \"Size\": 1072\n    },\n    \"res/animator/m3_extended_fab_change_size_collapse_motion_spec.xml\": {\n      \"Size\": 1116\n    },\n    \"res/animator/m3_extended_fab_change_size_expand_motion_spec.xml\": {\n      \"Size\": 1116\n    },\n    \"res/animator/m3_extended_fab_hide_motion_spec.xml\": {\n      \"Size\": 820\n    },\n    \"res/animator/m3_extended_fab_show_motion_spec.xml\": {\n      \"Size\": 820\n    },\n    \"res/animator/m3_extended_fab_state_list_animator.xml\": {\n      \"Size\": 2724\n    },\n    \"res/animator/mtrl_btn_state_list_anim.xml\": {\n      \"Size\": 2664\n    },\n    \"res/animator/mtrl_btn_unelevated_state_list_anim.xml\": {\n      \"Size\": 120\n    },\n    \"res/animator/mtrl_card_state_list_anim.xml\": {\n      \"Size\": 1208\n    },\n    \"res/animator/mtrl_chip_state_list_anim.xml\": {\n      \"Size\": 1072\n    },\n    \"res/animator/mtrl_extended_fab_change_size_collapse_motion_spec.xml\": {\n      \"Size\": 1116\n    },\n    \"res/animator/mtrl_extended_fab_change_size_expand_motion_spec.xml\": {\n      \"Size\": 1116\n    },\n    \"res/animator/mtrl_extended_fab_hide_motion_spec.xml\": {\n      \"Size\": 608\n    },\n    \"res/animator/mtrl_extended_fab_show_motion_spec.xml\": {\n      \"Size\": 820\n    },\n    \"res/animator/mtrl_extended_fab_state_list_animator.xml\": {\n      \"Size\": 2724\n    },\n    \"res/animator/mtrl_fab_hide_motion_spec.xml\": {\n      \"Size\": 796\n    },\n    \"res/animator/mtrl_fab_show_motion_spec.xml\": {\n      \"Size\": 796\n    },\n    \"res/animator/mtrl_fab_transformation_sheet_collapse_spec.xml\": {\n      \"Size\": 1888\n    },\n    \"res/animator/mtrl_fab_transformation_sheet_expand_spec.xml\": {\n      \"Size\": 1888\n    },\n    \"res/color-night-v8/material_timepicker_button_stroke.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-night-v8/material_timepicker_clockface.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-night-v8/material_timepicker_modebutton_tint.xml\": {\n      \"Size\": 340\n    },\n    \"res/color-v23/abc_btn_colored_borderless_text_material.xml\": {\n      \"Size\": 500\n    },\n    \"res/color-v23/abc_btn_colored_text_material.xml\": {\n      \"Size\": 500\n    },\n    \"res/color-v23/abc_color_highlight_material.xml\": {\n      \"Size\": 544\n    },\n    \"res/color-v23/abc_tint_btn_checkable.xml\": {\n      \"Size\": 624\n    },\n    \"res/color-v23/abc_tint_default.xml\": {\n      \"Size\": 1120\n    },\n    \"res/color-v23/abc_tint_edittext.xml\": {\n      \"Size\": 668\n    },\n    \"res/color-v23/abc_tint_seek_thumb.xml\": {\n      \"Size\": 500\n    },\n    \"res/color-v23/abc_tint_spinner.xml\": {\n      \"Size\": 668\n    },\n    \"res/color-v23/abc_tint_switch_track.xml\": {\n      \"Size\": 664\n    },\n    \"res/color-v31/m3_dynamic_dark_default_color_primary_text.xml\": {\n      \"Size\": 500\n    },\n    \"res/color-v31/m3_dynamic_dark_default_color_secondary_text.xml\": {\n      \"Size\": 500\n    },\n    \"res/color-v31/m3_dynamic_dark_highlighted_text.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_dynamic_dark_hint_foreground.xml\": {\n      \"Size\": 564\n    },\n    \"res/color-v31/m3_dynamic_dark_primary_text_disable_only.xml\": {\n      \"Size\": 500\n    },\n    \"res/color-v31/m3_dynamic_default_color_primary_text.xml\": {\n      \"Size\": 500\n    },\n    \"res/color-v31/m3_dynamic_default_color_secondary_text.xml\": {\n      \"Size\": 500\n    },\n    \"res/color-v31/m3_dynamic_highlighted_text.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_dynamic_hint_foreground.xml\": {\n      \"Size\": 564\n    },\n    \"res/color-v31/m3_dynamic_primary_text_disable_only.xml\": {\n      \"Size\": 500\n    },\n    \"res/color-v31/m3_ref_palette_dynamic_neutral12.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_ref_palette_dynamic_neutral17.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_ref_palette_dynamic_neutral22.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_ref_palette_dynamic_neutral24.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_ref_palette_dynamic_neutral4.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_ref_palette_dynamic_neutral6.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_ref_palette_dynamic_neutral87.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_ref_palette_dynamic_neutral92.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_ref_palette_dynamic_neutral94.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_ref_palette_dynamic_neutral96.xml\": {\n      \"Size\": 376\n    },\n    \"res/color-v31/m3_ref_palette_dynamic_neutral98.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/abc_background_cache_hint_selector_material_dark.xml\": {\n      \"Size\": 468\n    },\n    \"res/color/abc_background_cache_hint_selector_material_light.xml\": {\n      \"Size\": 468\n    },\n    \"res/color/abc_hint_foreground_material_dark.xml\": {\n      \"Size\": 564\n    },\n    \"res/color/abc_hint_foreground_material_light.xml\": {\n      \"Size\": 564\n    },\n    \"res/color/abc_primary_text_disable_only_material_dark.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/abc_primary_text_disable_only_material_light.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/abc_primary_text_material_dark.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/abc_primary_text_material_light.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/abc_search_url_text.xml\": {\n      \"Size\": 588\n    },\n    \"res/color/abc_secondary_text_material_dark.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/abc_secondary_text_material_light.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/design_box_stroke_color.xml\": {\n      \"Size\": 712\n    },\n    \"res/color/design_error.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/design_icon_tint.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/m3_appbar_overlay_color.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/m3_assist_chip_icon_tint_color.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_assist_chip_stroke_color.xml\": {\n      \"Size\": 872\n    },\n    \"res/color/m3_bottom_sheet_drag_handle_color.xml\": {\n      \"Size\": 340\n    },\n    \"res/color/m3_button_background_color_selector.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_button_foreground_color_selector.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_button_outline_color_selector.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_button_ripple_color_selector.xml\": {\n      \"Size\": 808\n    },\n    \"res/color/m3_button_ripple_color.xml\": {\n      \"Size\": 808\n    },\n    \"res/color/m3_calendar_item_disabled_text.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/m3_calendar_item_stroke_color.xml\": {\n      \"Size\": 712\n    },\n    \"res/color/m3_card_foreground_color.xml\": {\n      \"Size\": 768\n    },\n    \"res/color/m3_card_ripple_color.xml\": {\n      \"Size\": 1556\n    },\n    \"res/color/m3_card_stroke_color.xml\": {\n      \"Size\": 1224\n    },\n    \"res/color/m3_checkbox_button_icon_tint.xml\": {\n      \"Size\": 964\n    },\n    \"res/color/m3_checkbox_button_tint.xml\": {\n      \"Size\": 1000\n    },\n    \"res/color/m3_chip_assist_text_color.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_chip_background_color.xml\": {\n      \"Size\": 712\n    },\n    \"res/color/m3_chip_ripple_color.xml\": {\n      \"Size\": 1556\n    },\n    \"res/color/m3_chip_stroke_color.xml\": {\n      \"Size\": 872\n    },\n    \"res/color/m3_chip_text_color.xml\": {\n      \"Size\": 624\n    },\n    \"res/color/m3_dark_default_color_primary_text.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_dark_default_color_secondary_text.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_dark_highlighted_text.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/m3_dark_hint_foreground.xml\": {\n      \"Size\": 564\n    },\n    \"res/color/m3_dark_primary_text_disable_only.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_default_color_primary_text.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_default_color_secondary_text.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_efab_ripple_color_selector.xml\": {\n      \"Size\": 808\n    },\n    \"res/color/m3_elevated_chip_background_color.xml\": {\n      \"Size\": 748\n    },\n    \"res/color/m3_fab_efab_background_color_selector.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_fab_efab_foreground_color_selector.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_fab_ripple_color_selector.xml\": {\n      \"Size\": 808\n    },\n    \"res/color/m3_filled_icon_button_container_color_selector.xml\": {\n      \"Size\": 668\n    },\n    \"res/color/m3_highlighted_text.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/m3_hint_foreground.xml\": {\n      \"Size\": 564\n    },\n    \"res/color/m3_icon_button_icon_color_selector.xml\": {\n      \"Size\": 668\n    },\n    \"res/color/m3_navigation_bar_item_with_indicator_icon_tint.xml\": {\n      \"Size\": 1196\n    },\n    \"res/color/m3_navigation_bar_item_with_indicator_label_tint.xml\": {\n      \"Size\": 1196\n    },\n    \"res/color/m3_navigation_bar_ripple_color_selector.xml\": {\n      \"Size\": 1232\n    },\n    \"res/color/m3_navigation_item_background_color.xml\": {\n      \"Size\": 588\n    },\n    \"res/color/m3_navigation_item_icon_tint.xml\": {\n      \"Size\": 1356\n    },\n    \"res/color/m3_navigation_item_ripple_color.xml\": {\n      \"Size\": 1372\n    },\n    \"res/color/m3_navigation_item_text_color.xml\": {\n      \"Size\": 1356\n    },\n    \"res/color/m3_navigation_rail_item_with_indicator_icon_tint.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/m3_navigation_rail_item_with_indicator_label_tint.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/m3_navigation_rail_ripple_color_selector.xml\": {\n      \"Size\": 1232\n    },\n    \"res/color/m3_popupmenu_overlay_color.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/m3_primary_text_disable_only.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_radiobutton_button_tint.xml\": {\n      \"Size\": 1576\n    },\n    \"res/color/m3_radiobutton_ripple_tint.xml\": {\n      \"Size\": 1372\n    },\n    \"res/color/m3_selection_control_ripple_color_selector.xml\": {\n      \"Size\": 1372\n    },\n    \"res/color/m3_simple_item_ripple_color.xml\": {\n      \"Size\": 748\n    },\n    \"res/color/m3_slider_active_track_color.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_slider_halo_color.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_slider_inactive_track_color.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_slider_thumb_color.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_switch_thumb_tint.xml\": {\n      \"Size\": 588\n    },\n    \"res/color/m3_switch_track_tint.xml\": {\n      \"Size\": 624\n    },\n    \"res/color/m3_tabs_icon_color_secondary.xml\": {\n      \"Size\": 624\n    },\n    \"res/color/m3_tabs_icon_color.xml\": {\n      \"Size\": 624\n    },\n    \"res/color/m3_tabs_ripple_color_secondary.xml\": {\n      \"Size\": 1372\n    },\n    \"res/color/m3_tabs_ripple_color.xml\": {\n      \"Size\": 1372\n    },\n    \"res/color/m3_tabs_text_color_secondary.xml\": {\n      \"Size\": 624\n    },\n    \"res/color/m3_tabs_text_color.xml\": {\n      \"Size\": 624\n    },\n    \"res/color/m3_text_button_background_color_selector.xml\": {\n      \"Size\": 508\n    },\n    \"res/color/m3_text_button_foreground_color_selector.xml\": {\n      \"Size\": 748\n    },\n    \"res/color/m3_text_button_ripple_color_selector.xml\": {\n      \"Size\": 1936\n    },\n    \"res/color/m3_textfield_filled_background_color.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_textfield_indicator_text_color.xml\": {\n      \"Size\": 872\n    },\n    \"res/color/m3_textfield_input_text_color.xml\": {\n      \"Size\": 748\n    },\n    \"res/color/m3_textfield_label_color.xml\": {\n      \"Size\": 624\n    },\n    \"res/color/m3_textfield_stroke_color.xml\": {\n      \"Size\": 748\n    },\n    \"res/color/m3_timepicker_button_background_color.xml\": {\n      \"Size\": 528\n    },\n    \"res/color/m3_timepicker_button_ripple_color.xml\": {\n      \"Size\": 1536\n    },\n    \"res/color/m3_timepicker_button_text_color.xml\": {\n      \"Size\": 768\n    },\n    \"res/color/m3_timepicker_clock_text_color.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/m3_timepicker_display_background_color.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/m3_timepicker_display_ripple_color.xml\": {\n      \"Size\": 1372\n    },\n    \"res/color/m3_timepicker_display_text_color.xml\": {\n      \"Size\": 624\n    },\n    \"res/color/m3_timepicker_secondary_text_button_ripple_color.xml\": {\n      \"Size\": 808\n    },\n    \"res/color/m3_timepicker_secondary_text_button_text_color.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/m3_timepicker_time_input_stroke_color.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/m3_tonal_button_ripple_color_selector.xml\": {\n      \"Size\": 808\n    },\n    \"res/color/material_cursor_color.xml\": {\n      \"Size\": 340\n    },\n    \"res/color/material_divider_color.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_on_background_disabled.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_on_background_emphasis_high_type.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_on_background_emphasis_medium.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_on_primary_disabled.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_on_primary_emphasis_high_type.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_on_primary_emphasis_medium.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_on_surface_disabled.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_on_surface_emphasis_high_type.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_on_surface_emphasis_medium.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_on_surface_stroke.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_personalized__highlighted_text_inverse.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_personalized__highlighted_text.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_personalized_color_primary_text_inverse.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/material_personalized_color_primary_text.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/material_personalized_color_secondary_text_inverse.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/material_personalized_color_secondary_text.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/material_personalized_hint_foreground_inverse.xml\": {\n      \"Size\": 564\n    },\n    \"res/color/material_personalized_hint_foreground.xml\": {\n      \"Size\": 564\n    },\n    \"res/color/material_personalized_primary_inverse_text_disable_only.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/material_personalized_primary_text_disable_only.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/material_slider_active_tick_marks_color.xml\": {\n      \"Size\": 520\n    },\n    \"res/color/material_slider_active_track_color.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/material_slider_halo_color.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/material_slider_inactive_tick_marks_color.xml\": {\n      \"Size\": 520\n    },\n    \"res/color/material_slider_inactive_track_color.xml\": {\n      \"Size\": 520\n    },\n    \"res/color/material_slider_thumb_color.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/material_timepicker_button_background.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/material_timepicker_button_stroke.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_timepicker_clock_text_color.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/material_timepicker_clockface.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/material_timepicker_modebutton_tint.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/mtrl_btn_bg_color_selector.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/mtrl_btn_ripple_color.xml\": {\n      \"Size\": 948\n    },\n    \"res/color/mtrl_btn_stroke_color_selector.xml\": {\n      \"Size\": 520\n    },\n    \"res/color/mtrl_btn_text_btn_bg_color_selector.xml\": {\n      \"Size\": 520\n    },\n    \"res/color/mtrl_btn_text_btn_ripple_color.xml\": {\n      \"Size\": 948\n    },\n    \"res/color/mtrl_btn_text_color_selector.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/mtrl_calendar_item_stroke_color.xml\": {\n      \"Size\": 808\n    },\n    \"res/color/mtrl_calendar_selected_range.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/mtrl_card_view_foreground.xml\": {\n      \"Size\": 788\n    },\n    \"res/color/mtrl_card_view_ripple.xml\": {\n      \"Size\": 768\n    },\n    \"res/color/mtrl_chip_background_color.xml\": {\n      \"Size\": 848\n    },\n    \"res/color/mtrl_chip_close_icon_tint.xml\": {\n      \"Size\": 1092\n    },\n    \"res/color/mtrl_chip_surface_color.xml\": {\n      \"Size\": 340\n    },\n    \"res/color/mtrl_chip_text_color.xml\": {\n      \"Size\": 520\n    },\n    \"res/color/mtrl_choice_chip_background_color.xml\": {\n      \"Size\": 848\n    },\n    \"res/color/mtrl_choice_chip_ripple_color.xml\": {\n      \"Size\": 948\n    },\n    \"res/color/mtrl_choice_chip_text_color.xml\": {\n      \"Size\": 808\n    },\n    \"res/color/mtrl_error.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/mtrl_fab_bg_color_selector.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/mtrl_fab_icon_text_color_selector.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/mtrl_fab_ripple_color.xml\": {\n      \"Size\": 948\n    },\n    \"res/color/mtrl_filled_background_color.xml\": {\n      \"Size\": 808\n    },\n    \"res/color/mtrl_filled_icon_tint.xml\": {\n      \"Size\": 644\n    },\n    \"res/color/mtrl_filled_stroke_color.xml\": {\n      \"Size\": 788\n    },\n    \"res/color/mtrl_indicator_text_color.xml\": {\n      \"Size\": 520\n    },\n    \"res/color/mtrl_navigation_bar_colored_item_tint.xml\": {\n      \"Size\": 520\n    },\n    \"res/color/mtrl_navigation_bar_colored_ripple_color.xml\": {\n      \"Size\": 948\n    },\n    \"res/color/mtrl_navigation_bar_item_tint.xml\": {\n      \"Size\": 520\n    },\n    \"res/color/mtrl_navigation_bar_ripple_color.xml\": {\n      \"Size\": 1672\n    },\n    \"res/color/mtrl_navigation_item_background_color.xml\": {\n      \"Size\": 644\n    },\n    \"res/color/mtrl_navigation_item_icon_tint.xml\": {\n      \"Size\": 624\n    },\n    \"res/color/mtrl_navigation_item_text_color.xml\": {\n      \"Size\": 624\n    },\n    \"res/color/mtrl_on_primary_text_btn_text_color_selector.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/mtrl_on_surface_ripple_color.xml\": {\n      \"Size\": 808\n    },\n    \"res/color/mtrl_outlined_icon_tint.xml\": {\n      \"Size\": 644\n    },\n    \"res/color/mtrl_outlined_stroke_color.xml\": {\n      \"Size\": 788\n    },\n    \"res/color/mtrl_popupmenu_overlay_color.xml\": {\n      \"Size\": 376\n    },\n    \"res/color/mtrl_switch_thumb_icon_tint.xml\": {\n      \"Size\": 784\n    },\n    \"res/color/mtrl_switch_thumb_tint.xml\": {\n      \"Size\": 1028\n    },\n    \"res/color/mtrl_switch_track_decoration_tint.xml\": {\n      \"Size\": 624\n    },\n    \"res/color/mtrl_switch_track_tint.xml\": {\n      \"Size\": 784\n    },\n    \"res/color/mtrl_tabs_colored_ripple_color.xml\": {\n      \"Size\": 948\n    },\n    \"res/color/mtrl_tabs_icon_color_selector_colored.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/mtrl_tabs_icon_color_selector.xml\": {\n      \"Size\": 500\n    },\n    \"res/color/mtrl_tabs_legacy_text_color_selector.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/mtrl_tabs_ripple_color.xml\": {\n      \"Size\": 1672\n    },\n    \"res/color/mtrl_text_btn_text_color_selector.xml\": {\n      \"Size\": 888\n    },\n    \"res/color/switch_thumb_material_dark.xml\": {\n      \"Size\": 464\n    },\n    \"res/color/switch_thumb_material_light.xml\": {\n      \"Size\": 464\n    },\n    \"res/drawable-anydpi-v21/ic_call_answer_low.xml\": {\n      \"Size\": 1320\n    },\n    \"res/drawable-anydpi-v21/ic_call_answer_video_low.xml\": {\n      \"Size\": 736\n    },\n    \"res/drawable-anydpi-v21/ic_call_answer_video.xml\": {\n      \"Size\": 772\n    },\n    \"res/drawable-anydpi-v21/ic_call_answer.xml\": {\n      \"Size\": 1356\n    },\n    \"res/drawable-anydpi-v21/ic_call_decline_low.xml\": {\n      \"Size\": 1492\n    },\n    \"res/drawable-anydpi-v21/ic_call_decline.xml\": {\n      \"Size\": 1528\n    },\n    \"res/drawable-hdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png\": {\n      \"Size\": 272\n    },\n    \"res/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_000.png\": {\n      \"Size\": 227\n    },\n    \"res/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_015.png\": {\n      \"Size\": 404\n    },\n    \"res/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_000.png\": {\n      \"Size\": 464\n    },\n    \"res/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_015.png\": {\n      \"Size\": 563\n    },\n    \"res/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png\": {\n      \"Size\": 1096\n    },\n    \"res/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png\": {\n      \"Size\": 1243\n    },\n    \"res/drawable-hdpi-v4/abc_cab_background_top_mtrl_alpha.9.png\": {\n      \"Size\": 226\n    },\n    \"res/drawable-hdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png\": {\n      \"Size\": 171\n    },\n    \"res/drawable-hdpi-v4/abc_list_divider_mtrl_alpha.9.png\": {\n      \"Size\": 167\n    },\n    \"res/drawable-hdpi-v4/abc_list_focused_holo.9.png\": {\n      \"Size\": 244\n    },\n    \"res/drawable-hdpi-v4/abc_list_longpressed_holo.9.png\": {\n      \"Size\": 212\n    },\n    \"res/drawable-hdpi-v4/abc_list_pressed_holo_dark.9.png\": {\n      \"Size\": 208\n    },\n    \"res/drawable-hdpi-v4/abc_list_pressed_holo_light.9.png\": {\n      \"Size\": 208\n    },\n    \"res/drawable-hdpi-v4/abc_list_selector_disabled_holo_dark.9.png\": {\n      \"Size\": 228\n    },\n    \"res/drawable-hdpi-v4/abc_list_selector_disabled_holo_light.9.png\": {\n      \"Size\": 229\n    },\n    \"res/drawable-hdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png\": {\n      \"Size\": 738\n    },\n    \"res/drawable-hdpi-v4/abc_popup_background_mtrl_mult.9.png\": {\n      \"Size\": 1098\n    },\n    \"res/drawable-hdpi-v4/abc_scrubber_control_off_mtrl_alpha.png\": {\n      \"Size\": 201\n    },\n    \"res/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png\": {\n      \"Size\": 196\n    },\n    \"res/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png\": {\n      \"Size\": 272\n    },\n    \"res/drawable-hdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png\": {\n      \"Size\": 205\n    },\n    \"res/drawable-hdpi-v4/abc_scrubber_track_mtrl_alpha.9.png\": {\n      \"Size\": 196\n    },\n    \"res/drawable-hdpi-v4/abc_spinner_mtrl_am_alpha.9.png\": {\n      \"Size\": 345\n    },\n    \"res/drawable-hdpi-v4/abc_switch_track_mtrl_alpha.9.png\": {\n      \"Size\": 484\n    },\n    \"res/drawable-hdpi-v4/abc_tab_indicator_mtrl_alpha.9.png\": {\n      \"Size\": 190\n    },\n    \"res/drawable-hdpi-v4/abc_text_select_handle_left_mtrl.png\": {\n      \"Size\": 278\n    },\n    \"res/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl.png\": {\n      \"Size\": 396\n    },\n    \"res/drawable-hdpi-v4/abc_text_select_handle_right_mtrl.png\": {\n      \"Size\": 262\n    },\n    \"res/drawable-hdpi-v4/abc_textfield_activated_mtrl_alpha.9.png\": {\n      \"Size\": 186\n    },\n    \"res/drawable-hdpi-v4/abc_textfield_default_mtrl_alpha.9.png\": {\n      \"Size\": 192\n    },\n    \"res/drawable-hdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png\": {\n      \"Size\": 178\n    },\n    \"res/drawable-hdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png\": {\n      \"Size\": 178\n    },\n    \"res/drawable-hdpi-v4/ic_call_answer_low.png\": {\n      \"Size\": 472\n    },\n    \"res/drawable-hdpi-v4/ic_call_answer_video_low.png\": {\n      \"Size\": 254\n    },\n    \"res/drawable-hdpi-v4/ic_call_answer_video.png\": {\n      \"Size\": 254\n    },\n    \"res/drawable-hdpi-v4/ic_call_answer.png\": {\n      \"Size\": 472\n    },\n    \"res/drawable-hdpi-v4/ic_call_decline_low.png\": {\n      \"Size\": 375\n    },\n    \"res/drawable-hdpi-v4/ic_call_decline.png\": {\n      \"Size\": 375\n    },\n    \"res/drawable-hdpi-v4/notification_bg_low_normal.9.png\": {\n      \"Size\": 212\n    },\n    \"res/drawable-hdpi-v4/notification_bg_low_pressed.9.png\": {\n      \"Size\": 225\n    },\n    \"res/drawable-hdpi-v4/notification_bg_normal_pressed.9.png\": {\n      \"Size\": 225\n    },\n    \"res/drawable-hdpi-v4/notification_bg_normal.9.png\": {\n      \"Size\": 212\n    },\n    \"res/drawable-hdpi-v4/notification_oversize_large_icon_bg.png\": {\n      \"Size\": 909\n    },\n    \"res/drawable-hdpi-v4/notify_panel_notification_icon_bg.png\": {\n      \"Size\": 107\n    },\n    \"res/drawable-hdpi-v4/spice.png\": {\n      \"Size\": 6895\n    },\n    \"res/drawable-hdpi-v4/splash.png\": {\n      \"Size\": 1455\n    },\n    \"res/drawable-ldpi-v4/ic_call_answer_low.png\": {\n      \"Size\": 270\n    },\n    \"res/drawable-ldpi-v4/ic_call_answer_video_low.png\": {\n      \"Size\": 199\n    },\n    \"res/drawable-ldpi-v4/ic_call_answer_video.png\": {\n      \"Size\": 199\n    },\n    \"res/drawable-ldpi-v4/ic_call_answer.png\": {\n      \"Size\": 270\n    },\n    \"res/drawable-ldpi-v4/ic_call_decline_low.png\": {\n      \"Size\": 201\n    },\n    \"res/drawable-ldpi-v4/ic_call_decline.png\": {\n      \"Size\": 201\n    },\n    \"res/drawable-ldrtl-hdpi-v17/abc_spinner_mtrl_am_alpha.9.png\": {\n      \"Size\": 345\n    },\n    \"res/drawable-ldrtl-mdpi-v17/abc_spinner_mtrl_am_alpha.9.png\": {\n      \"Size\": 318\n    },\n    \"res/drawable-ldrtl-xhdpi-v17/abc_spinner_mtrl_am_alpha.9.png\": {\n      \"Size\": 417\n    },\n    \"res/drawable-ldrtl-xxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png\": {\n      \"Size\": 525\n    },\n    \"res/drawable-ldrtl-xxxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png\": {\n      \"Size\": 437\n    },\n    \"res/drawable-mdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png\": {\n      \"Size\": 267\n    },\n    \"res/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_000.png\": {\n      \"Size\": 214\n    },\n    \"res/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_015.png\": {\n      \"Size\": 321\n    },\n    \"res/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_000.png\": {\n      \"Size\": 324\n    },\n    \"res/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_015.png\": {\n      \"Size\": 356\n    },\n    \"res/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png\": {\n      \"Size\": 754\n    },\n    \"res/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png\": {\n      \"Size\": 825\n    },\n    \"res/drawable-mdpi-v4/abc_cab_background_top_mtrl_alpha.9.png\": {\n      \"Size\": 216\n    },\n    \"res/drawable-mdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png\": {\n      \"Size\": 173\n    },\n    \"res/drawable-mdpi-v4/abc_list_divider_mtrl_alpha.9.png\": {\n      \"Size\": 167\n    },\n    \"res/drawable-mdpi-v4/abc_list_focused_holo.9.png\": {\n      \"Size\": 222\n    },\n    \"res/drawable-mdpi-v4/abc_list_longpressed_holo.9.png\": {\n      \"Size\": 211\n    },\n    \"res/drawable-mdpi-v4/abc_list_pressed_holo_dark.9.png\": {\n      \"Size\": 207\n    },\n    \"res/drawable-mdpi-v4/abc_list_pressed_holo_light.9.png\": {\n      \"Size\": 207\n    },\n    \"res/drawable-mdpi-v4/abc_list_selector_disabled_holo_dark.9.png\": {\n      \"Size\": 217\n    },\n    \"res/drawable-mdpi-v4/abc_list_selector_disabled_holo_light.9.png\": {\n      \"Size\": 217\n    },\n    \"res/drawable-mdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png\": {\n      \"Size\": 541\n    },\n    \"res/drawable-mdpi-v4/abc_popup_background_mtrl_mult.9.png\": {\n      \"Size\": 776\n    },\n    \"res/drawable-mdpi-v4/abc_scrubber_control_off_mtrl_alpha.png\": {\n      \"Size\": 159\n    },\n    \"res/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png\": {\n      \"Size\": 145\n    },\n    \"res/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png\": {\n      \"Size\": 197\n    },\n    \"res/drawable-mdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png\": {\n      \"Size\": 203\n    },\n    \"res/drawable-mdpi-v4/abc_scrubber_track_mtrl_alpha.9.png\": {\n      \"Size\": 194\n    },\n    \"res/drawable-mdpi-v4/abc_spinner_mtrl_am_alpha.9.png\": {\n      \"Size\": 327\n    },\n    \"res/drawable-mdpi-v4/abc_switch_track_mtrl_alpha.9.png\": {\n      \"Size\": 395\n    },\n    \"res/drawable-mdpi-v4/abc_tab_indicator_mtrl_alpha.9.png\": {\n      \"Size\": 186\n    },\n    \"res/drawable-mdpi-v4/abc_text_select_handle_left_mtrl.png\": {\n      \"Size\": 203\n    },\n    \"res/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl.png\": {\n      \"Size\": 310\n    },\n    \"res/drawable-mdpi-v4/abc_text_select_handle_right_mtrl.png\": {\n      \"Size\": 186\n    },\n    \"res/drawable-mdpi-v4/abc_textfield_activated_mtrl_alpha.9.png\": {\n      \"Size\": 181\n    },\n    \"res/drawable-mdpi-v4/abc_textfield_default_mtrl_alpha.9.png\": {\n      \"Size\": 178\n    },\n    \"res/drawable-mdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png\": {\n      \"Size\": 178\n    },\n    \"res/drawable-mdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png\": {\n      \"Size\": 178\n    },\n    \"res/drawable-mdpi-v4/ic_call_answer_low.png\": {\n      \"Size\": 317\n    },\n    \"res/drawable-mdpi-v4/ic_call_answer_video_low.png\": {\n      \"Size\": 206\n    },\n    \"res/drawable-mdpi-v4/ic_call_answer_video.png\": {\n      \"Size\": 206\n    },\n    \"res/drawable-mdpi-v4/ic_call_answer.png\": {\n      \"Size\": 317\n    },\n    \"res/drawable-mdpi-v4/ic_call_decline_low.png\": {\n      \"Size\": 264\n    },\n    \"res/drawable-mdpi-v4/ic_call_decline.png\": {\n      \"Size\": 264\n    },\n    \"res/drawable-mdpi-v4/notification_bg_low_normal.9.png\": {\n      \"Size\": 215\n    },\n    \"res/drawable-mdpi-v4/notification_bg_low_pressed.9.png\": {\n      \"Size\": 223\n    },\n    \"res/drawable-mdpi-v4/notification_bg_normal_pressed.9.png\": {\n      \"Size\": 223\n    },\n    \"res/drawable-mdpi-v4/notification_bg_normal.9.png\": {\n      \"Size\": 215\n    },\n    \"res/drawable-mdpi-v4/notify_panel_notification_icon_bg.png\": {\n      \"Size\": 98\n    },\n    \"res/drawable-mdpi-v4/spice.png\": {\n      \"Size\": 4314\n    },\n    \"res/drawable-mdpi-v4/splash.png\": {\n      \"Size\": 1241\n    },\n    \"res/drawable-v21/abc_action_bar_item_background_material.xml\": {\n      \"Size\": 264\n    },\n    \"res/drawable-v21/abc_btn_colored_material.xml\": {\n      \"Size\": 1716\n    },\n    \"res/drawable-v21/abc_dialog_material_background.xml\": {\n      \"Size\": 716\n    },\n    \"res/drawable-v21/abc_edit_text_material.xml\": {\n      \"Size\": 1172\n    },\n    \"res/drawable-v21/abc_list_divider_material.xml\": {\n      \"Size\": 516\n    },\n    \"res/drawable-v21/material_cursor_drawable.xml\": {\n      \"Size\": 588\n    },\n    \"res/drawable-v21/mtrl_navigation_bar_item_background.xml\": {\n      \"Size\": 264\n    },\n    \"res/drawable-v21/notification_action_background.xml\": {\n      \"Size\": 1180\n    },\n    \"res/drawable-v23/abc_control_background_material.xml\": {\n      \"Size\": 304\n    },\n    \"res/drawable-v23/m3_appbar_background.xml\": {\n      \"Size\": 684\n    },\n    \"res/drawable-v23/m3_popupmenu_background_overlay.xml\": {\n      \"Size\": 1228\n    },\n    \"res/drawable-v23/m3_radiobutton_ripple.xml\": {\n      \"Size\": 304\n    },\n    \"res/drawable-v23/m3_selection_control_ripple.xml\": {\n      \"Size\": 304\n    },\n    \"res/drawable-v23/m3_tabs_background.xml\": {\n      \"Size\": 868\n    },\n    \"res/drawable-v23/m3_tabs_transparent_background.xml\": {\n      \"Size\": 632\n    },\n    \"res/drawable-v23/mtrl_popupmenu_background_overlay.xml\": {\n      \"Size\": 1228\n    },\n    \"res/drawable-v31/maui_splash_image.xml\": {\n      \"Size\": 580\n    },\n    \"res/drawable-watch-v20/abc_dialog_material_background.xml\": {\n      \"Size\": 372\n    },\n    \"res/drawable-xhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png\": {\n      \"Size\": 280\n    },\n    \"res/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_000.png\": {\n      \"Size\": 281\n    },\n    \"res/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_015.png\": {\n      \"Size\": 432\n    },\n    \"res/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_000.png\": {\n      \"Size\": 651\n    },\n    \"res/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_015.png\": {\n      \"Size\": 785\n    },\n    \"res/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png\": {\n      \"Size\": 1526\n    },\n    \"res/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png\": {\n      \"Size\": 1731\n    },\n    \"res/drawable-xhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png\": {\n      \"Size\": 229\n    },\n    \"res/drawable-xhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png\": {\n      \"Size\": 228\n    },\n    \"res/drawable-xhdpi-v4/abc_list_divider_mtrl_alpha.9.png\": {\n      \"Size\": 167\n    },\n    \"res/drawable-xhdpi-v4/abc_list_focused_holo.9.png\": {\n      \"Size\": 244\n    },\n    \"res/drawable-xhdpi-v4/abc_list_longpressed_holo.9.png\": {\n      \"Size\": 214\n    },\n    \"res/drawable-xhdpi-v4/abc_list_pressed_holo_dark.9.png\": {\n      \"Size\": 209\n    },\n    \"res/drawable-xhdpi-v4/abc_list_pressed_holo_light.9.png\": {\n      \"Size\": 209\n    },\n    \"res/drawable-xhdpi-v4/abc_list_selector_disabled_holo_dark.9.png\": {\n      \"Size\": 236\n    },\n    \"res/drawable-xhdpi-v4/abc_list_selector_disabled_holo_light.9.png\": {\n      \"Size\": 235\n    },\n    \"res/drawable-xhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png\": {\n      \"Size\": 966\n    },\n    \"res/drawable-xhdpi-v4/abc_popup_background_mtrl_mult.9.png\": {\n      \"Size\": 1544\n    },\n    \"res/drawable-xhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png\": {\n      \"Size\": 267\n    },\n    \"res/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png\": {\n      \"Size\": 267\n    },\n    \"res/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png\": {\n      \"Size\": 391\n    },\n    \"res/drawable-xhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png\": {\n      \"Size\": 208\n    },\n    \"res/drawable-xhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png\": {\n      \"Size\": 198\n    },\n    \"res/drawable-xhdpi-v4/abc_spinner_mtrl_am_alpha.9.png\": {\n      \"Size\": 448\n    },\n    \"res/drawable-xhdpi-v4/abc_switch_track_mtrl_alpha.9.png\": {\n      \"Size\": 618\n    },\n    \"res/drawable-xhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png\": {\n      \"Size\": 194\n    },\n    \"res/drawable-xhdpi-v4/abc_text_select_handle_left_mtrl.png\": {\n      \"Size\": 335\n    },\n    \"res/drawable-xhdpi-v4/abc_text_select_handle_middle_mtrl.png\": {\n      \"Size\": 585\n    },\n    \"res/drawable-xhdpi-v4/abc_text_select_handle_right_mtrl.png\": {\n      \"Size\": 318\n    },\n    \"res/drawable-xhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png\": {\n      \"Size\": 189\n    },\n    \"res/drawable-xhdpi-v4/abc_textfield_default_mtrl_alpha.9.png\": {\n      \"Size\": 187\n    },\n    \"res/drawable-xhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png\": {\n      \"Size\": 184\n    },\n    \"res/drawable-xhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png\": {\n      \"Size\": 182\n    },\n    \"res/drawable-xhdpi-v4/ic_call_answer_low.png\": {\n      \"Size\": 623\n    },\n    \"res/drawable-xhdpi-v4/ic_call_answer_video_low.png\": {\n      \"Size\": 290\n    },\n    \"res/drawable-xhdpi-v4/ic_call_answer_video.png\": {\n      \"Size\": 290\n    },\n    \"res/drawable-xhdpi-v4/ic_call_answer.png\": {\n      \"Size\": 623\n    },\n    \"res/drawable-xhdpi-v4/ic_call_decline_low.png\": {\n      \"Size\": 452\n    },\n    \"res/drawable-xhdpi-v4/ic_call_decline.png\": {\n      \"Size\": 452\n    },\n    \"res/drawable-xhdpi-v4/notification_bg_low_normal.9.png\": {\n      \"Size\": 221\n    },\n    \"res/drawable-xhdpi-v4/notification_bg_low_pressed.9.png\": {\n      \"Size\": 252\n    },\n    \"res/drawable-xhdpi-v4/notification_bg_normal_pressed.9.png\": {\n      \"Size\": 247\n    },\n    \"res/drawable-xhdpi-v4/notification_bg_normal.9.png\": {\n      \"Size\": 221\n    },\n    \"res/drawable-xhdpi-v4/notify_panel_notification_icon_bg.png\": {\n      \"Size\": 138\n    },\n    \"res/drawable-xhdpi-v4/spice.png\": {\n      \"Size\": 8300\n    },\n    \"res/drawable-xhdpi-v4/splash.png\": {\n      \"Size\": 2041\n    },\n    \"res/drawable-xxhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png\": {\n      \"Size\": 286\n    },\n    \"res/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_000.png\": {\n      \"Size\": 307\n    },\n    \"res/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_015.png\": {\n      \"Size\": 593\n    },\n    \"res/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png\": {\n      \"Size\": 984\n    },\n    \"res/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png\": {\n      \"Size\": 1208\n    },\n    \"res/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png\": {\n      \"Size\": 2463\n    },\n    \"res/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png\": {\n      \"Size\": 2834\n    },\n    \"res/drawable-xxhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png\": {\n      \"Size\": 237\n    },\n    \"res/drawable-xxhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png\": {\n      \"Size\": 224\n    },\n    \"res/drawable-xxhdpi-v4/abc_list_divider_mtrl_alpha.9.png\": {\n      \"Size\": 171\n    },\n    \"res/drawable-xxhdpi-v4/abc_list_focused_holo.9.png\": {\n      \"Size\": 245\n    },\n    \"res/drawable-xxhdpi-v4/abc_list_longpressed_holo.9.png\": {\n      \"Size\": 221\n    },\n    \"res/drawable-xxhdpi-v4/abc_list_pressed_holo_dark.9.png\": {\n      \"Size\": 212\n    },\n    \"res/drawable-xxhdpi-v4/abc_list_pressed_holo_light.9.png\": {\n      \"Size\": 212\n    },\n    \"res/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_dark.9.png\": {\n      \"Size\": 260\n    },\n    \"res/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_light.9.png\": {\n      \"Size\": 258\n    },\n    \"res/drawable-xxhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png\": {\n      \"Size\": 1779\n    },\n    \"res/drawable-xxhdpi-v4/abc_popup_background_mtrl_mult.9.png\": {\n      \"Size\": 2305\n    },\n    \"res/drawable-xxhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png\": {\n      \"Size\": 322\n    },\n    \"res/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png\": {\n      \"Size\": 403\n    },\n    \"res/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png\": {\n      \"Size\": 595\n    },\n    \"res/drawable-xxhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png\": {\n      \"Size\": 210\n    },\n    \"res/drawable-xxhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png\": {\n      \"Size\": 207\n    },\n    \"res/drawable-xxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png\": {\n      \"Size\": 524\n    },\n    \"res/drawable-xxhdpi-v4/abc_switch_track_mtrl_alpha.9.png\": {\n      \"Size\": 851\n    },\n    \"res/drawable-xxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png\": {\n      \"Size\": 204\n    },\n    \"res/drawable-xxhdpi-v4/abc_text_select_handle_left_mtrl.png\": {\n      \"Size\": 420\n    },\n    \"res/drawable-xxhdpi-v4/abc_text_select_handle_middle_mtrl.png\": {\n      \"Size\": 753\n    },\n    \"res/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl.png\": {\n      \"Size\": 422\n    },\n    \"res/drawable-xxhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png\": {\n      \"Size\": 199\n    },\n    \"res/drawable-xxhdpi-v4/abc_textfield_default_mtrl_alpha.9.png\": {\n      \"Size\": 200\n    },\n    \"res/drawable-xxhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png\": {\n      \"Size\": 187\n    },\n    \"res/drawable-xxhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png\": {\n      \"Size\": 186\n    },\n    \"res/drawable-xxhdpi-v4/ic_call_answer_low.png\": {\n      \"Size\": 884\n    },\n    \"res/drawable-xxhdpi-v4/ic_call_answer_video_low.png\": {\n      \"Size\": 384\n    },\n    \"res/drawable-xxhdpi-v4/ic_call_answer_video.png\": {\n      \"Size\": 384\n    },\n    \"res/drawable-xxhdpi-v4/ic_call_answer.png\": {\n      \"Size\": 884\n    },\n    \"res/drawable-xxhdpi-v4/ic_call_decline_low.png\": {\n      \"Size\": 628\n    },\n    \"res/drawable-xxhdpi-v4/ic_call_decline.png\": {\n      \"Size\": 628\n    },\n    \"res/drawable-xxhdpi-v4/spice.png\": {\n      \"Size\": 13935\n    },\n    \"res/drawable-xxhdpi-v4/splash.png\": {\n      \"Size\": 2574\n    },\n    \"res/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_000.png\": {\n      \"Size\": 275\n    },\n    \"res/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_015.png\": {\n      \"Size\": 476\n    },\n    \"res/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png\": {\n      \"Size\": 785\n    },\n    \"res/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png\": {\n      \"Size\": 946\n    },\n    \"res/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png\": {\n      \"Size\": 2505\n    },\n    \"res/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png\": {\n      \"Size\": 2816\n    },\n    \"res/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png\": {\n      \"Size\": 415\n    },\n    \"res/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png\": {\n      \"Size\": 631\n    },\n    \"res/drawable-xxxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png\": {\n      \"Size\": 430\n    },\n    \"res/drawable-xxxhdpi-v4/abc_switch_track_mtrl_alpha.9.png\": {\n      \"Size\": 813\n    },\n    \"res/drawable-xxxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png\": {\n      \"Size\": 202\n    },\n    \"res/drawable-xxxhdpi-v4/abc_text_select_handle_left_mtrl.png\": {\n      \"Size\": 513\n    },\n    \"res/drawable-xxxhdpi-v4/abc_text_select_handle_right_mtrl.png\": {\n      \"Size\": 513\n    },\n    \"res/drawable-xxxhdpi-v4/ic_call_answer_low.png\": {\n      \"Size\": 1171\n    },\n    \"res/drawable-xxxhdpi-v4/ic_call_answer_video_low.png\": {\n      \"Size\": 465\n    },\n    \"res/drawable-xxxhdpi-v4/ic_call_answer_video.png\": {\n      \"Size\": 465\n    },\n    \"res/drawable-xxxhdpi-v4/ic_call_answer.png\": {\n      \"Size\": 1171\n    },\n    \"res/drawable-xxxhdpi-v4/ic_call_decline_low.png\": {\n      \"Size\": 823\n    },\n    \"res/drawable-xxxhdpi-v4/ic_call_decline.png\": {\n      \"Size\": 823\n    },\n    \"res/drawable-xxxhdpi-v4/spice.png\": {\n      \"Size\": 15087\n    },\n    \"res/drawable-xxxhdpi-v4/splash.png\": {\n      \"Size\": 2532\n    },\n    \"res/drawable/$avd_hide_password__0.xml\": {\n      \"Size\": 1176\n    },\n    \"res/drawable/$avd_hide_password__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$avd_hide_password__2.xml\": {\n      \"Size\": 556\n    },\n    \"res/drawable/$avd_show_password__0.xml\": {\n      \"Size\": 1136\n    },\n    \"res/drawable/$avd_show_password__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$avd_show_password__2.xml\": {\n      \"Size\": 556\n    },\n    \"res/drawable/$m3_avd_hide_password__0.xml\": {\n      \"Size\": 1176\n    },\n    \"res/drawable/$m3_avd_hide_password__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$m3_avd_hide_password__2.xml\": {\n      \"Size\": 556\n    },\n    \"res/drawable/$m3_avd_show_password__0.xml\": {\n      \"Size\": 1136\n    },\n    \"res/drawable/$m3_avd_show_password__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$m3_avd_show_password__2.xml\": {\n      \"Size\": 556\n    },\n    \"res/drawable/$mtrl_checkbox_button_checked_unchecked__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_checked_unchecked__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_checked_unchecked__2.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_checked_indeterminate__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_checked_unchecked__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_checked_unchecked__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_checked_unchecked__2.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_indeterminate_checked__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_indeterminate_unchecked__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_indeterminate_unchecked__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_indeterminate_unchecked__2.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_unchecked_checked__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_unchecked_checked__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_unchecked_checked__2.xml\": {\n      \"Size\": 596\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_unchecked_indeterminate__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_unchecked_indeterminate__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_icon_unchecked_indeterminate__2.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_unchecked_checked__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_unchecked_checked__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_checkbox_button_unchecked_checked__2.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_switch_thumb_checked_pressed__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_switch_thumb_checked_unchecked__0.xml\": {\n      \"Size\": 548\n    },\n    \"res/drawable/$mtrl_switch_thumb_checked_unchecked__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_switch_thumb_pressed_checked__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_switch_thumb_pressed_unchecked__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_switch_thumb_unchecked_checked__0.xml\": {\n      \"Size\": 548\n    },\n    \"res/drawable/$mtrl_switch_thumb_unchecked_checked__1.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/$mtrl_switch_thumb_unchecked_pressed__0.xml\": {\n      \"Size\": 592\n    },\n    \"res/drawable/abc_btn_borderless_material.xml\": {\n      \"Size\": 588\n    },\n    \"res/drawable/abc_btn_check_material_anim.xml\": {\n      \"Size\": 816\n    },\n    \"res/drawable/abc_btn_check_material.xml\": {\n      \"Size\": 464\n    },\n    \"res/drawable/abc_btn_default_mtrl_shape.xml\": {\n      \"Size\": 932\n    },\n    \"res/drawable/abc_btn_radio_material_anim.xml\": {\n      \"Size\": 816\n    },\n    \"res/drawable/abc_btn_radio_material.xml\": {\n      \"Size\": 464\n    },\n    \"res/drawable/abc_cab_background_internal_bg.xml\": {\n      \"Size\": 372\n    },\n    \"res/drawable/abc_cab_background_top_material.xml\": {\n      \"Size\": 336\n    },\n    \"res/drawable/abc_ic_ab_back_material.xml\": {\n      \"Size\": 692\n    },\n    \"res/drawable/abc_ic_arrow_drop_right_black_24dp.xml\": {\n      \"Size\": 1000\n    },\n    \"res/drawable/abc_ic_clear_material.xml\": {\n      \"Size\": 684\n    },\n    \"res/drawable/abc_ic_go_search_api_material.xml\": {\n      \"Size\": 640\n    },\n    \"res/drawable/abc_ic_menu_copy_mtrl_am_alpha.xml\": {\n      \"Size\": 756\n    },\n    \"res/drawable/abc_ic_menu_cut_mtrl_alpha.xml\": {\n      \"Size\": 1096\n    },\n    \"res/drawable/abc_ic_menu_overflow_material.xml\": {\n      \"Size\": 792\n    },\n    \"res/drawable/abc_ic_menu_paste_mtrl_am_alpha.xml\": {\n      \"Size\": 796\n    },\n    \"res/drawable/abc_ic_menu_selectall_mtrl_alpha.xml\": {\n      \"Size\": 920\n    },\n    \"res/drawable/abc_ic_menu_share_mtrl_alpha.xml\": {\n      \"Size\": 980\n    },\n    \"res/drawable/abc_ic_search_api_material.xml\": {\n      \"Size\": 812\n    },\n    \"res/drawable/abc_ic_voice_search_api_material.xml\": {\n      \"Size\": 828\n    },\n    \"res/drawable/abc_item_background_holo_dark.xml\": {\n      \"Size\": 1012\n    },\n    \"res/drawable/abc_item_background_holo_light.xml\": {\n      \"Size\": 1012\n    },\n    \"res/drawable/abc_list_selector_background_transition_holo_dark.xml\": {\n      \"Size\": 424\n    },\n    \"res/drawable/abc_list_selector_background_transition_holo_light.xml\": {\n      \"Size\": 424\n    },\n    \"res/drawable/abc_list_selector_holo_dark.xml\": {\n      \"Size\": 1064\n    },\n    \"res/drawable/abc_list_selector_holo_light.xml\": {\n      \"Size\": 1064\n    },\n    \"res/drawable/abc_ratingbar_indicator_material.xml\": {\n      \"Size\": 124\n    },\n    \"res/drawable/abc_ratingbar_material.xml\": {\n      \"Size\": 124\n    },\n    \"res/drawable/abc_ratingbar_small_material.xml\": {\n      \"Size\": 124\n    },\n    \"res/drawable/abc_seekbar_thumb_material.xml\": {\n      \"Size\": 1100\n    },\n    \"res/drawable/abc_seekbar_tick_mark_material.xml\": {\n      \"Size\": 516\n    },\n    \"res/drawable/abc_seekbar_track_material.xml\": {\n      \"Size\": 1408\n    },\n    \"res/drawable/abc_spinner_textfield_background_material.xml\": {\n      \"Size\": 1160\n    },\n    \"res/drawable/abc_star_black_48dp.xml\": {\n      \"Size\": 640\n    },\n    \"res/drawable/abc_star_half_black_48dp.xml\": {\n      \"Size\": 600\n    },\n    \"res/drawable/abc_switch_thumb_material.xml\": {\n      \"Size\": 464\n    },\n    \"res/drawable/abc_tab_indicator_material.xml\": {\n      \"Size\": 468\n    },\n    \"res/drawable/abc_text_cursor_material.xml\": {\n      \"Size\": 516\n    },\n    \"res/drawable/abc_textfield_search_material.xml\": {\n      \"Size\": 756\n    },\n    \"res/drawable/abc_vector_test.xml\": {\n      \"Size\": 612\n    },\n    \"res/drawable/avd_hide_password.xml\": {\n      \"Size\": 660\n    },\n    \"res/drawable/avd_show_password.xml\": {\n      \"Size\": 660\n    },\n    \"res/drawable/btn_checkbox_checked_mtrl.xml\": {\n      \"Size\": 2688\n    },\n    \"res/drawable/btn_checkbox_checked_to_unchecked_mtrl_animation.xml\": {\n      \"Size\": 688\n    },\n    \"res/drawable/btn_checkbox_unchecked_mtrl.xml\": {\n      \"Size\": 2660\n    },\n    \"res/drawable/btn_checkbox_unchecked_to_checked_mtrl_animation.xml\": {\n      \"Size\": 688\n    },\n    \"res/drawable/btn_radio_off_mtrl.xml\": {\n      \"Size\": 1728\n    },\n    \"res/drawable/btn_radio_off_to_on_mtrl_animation.xml\": {\n      \"Size\": 680\n    },\n    \"res/drawable/btn_radio_on_mtrl.xml\": {\n      \"Size\": 1656\n    },\n    \"res/drawable/btn_radio_on_to_off_mtrl_animation.xml\": {\n      \"Size\": 680\n    },\n    \"res/drawable/design_fab_background.xml\": {\n      \"Size\": 372\n    },\n    \"res/drawable/design_ic_visibility_off.xml\": {\n      \"Size\": 1144\n    },\n    \"res/drawable/design_ic_visibility.xml\": {\n      \"Size\": 540\n    },\n    \"res/drawable/design_password_eye.xml\": {\n      \"Size\": 816\n    },\n    \"res/drawable/design_snackbar_background.xml\": {\n      \"Size\": 484\n    },\n    \"res/drawable/ic_arrow_back_black_24.xml\": {\n      \"Size\": 612\n    },\n    \"res/drawable/ic_clear_black_24.xml\": {\n      \"Size\": 684\n    },\n    \"res/drawable/ic_clock_black_24dp.xml\": {\n      \"Size\": 752\n    },\n    \"res/drawable/ic_keyboard_black_24dp.xml\": {\n      \"Size\": 852\n    },\n    \"res/drawable/ic_m3_chip_check.xml\": {\n      \"Size\": 704\n    },\n    \"res/drawable/ic_m3_chip_checked_circle.xml\": {\n      \"Size\": 900\n    },\n    \"res/drawable/ic_m3_chip_close.xml\": {\n      \"Size\": 648\n    },\n    \"res/drawable/ic_mtrl_checked_circle.xml\": {\n      \"Size\": 672\n    },\n    \"res/drawable/ic_mtrl_chip_checked_black.xml\": {\n      \"Size\": 600\n    },\n    \"res/drawable/ic_mtrl_chip_checked_circle.xml\": {\n      \"Size\": 940\n    },\n    \"res/drawable/ic_mtrl_chip_close_circle.xml\": {\n      \"Size\": 808\n    },\n    \"res/drawable/ic_search_black_24.xml\": {\n      \"Size\": 800\n    },\n    \"res/drawable/m3_avd_hide_password.xml\": {\n      \"Size\": 660\n    },\n    \"res/drawable/m3_avd_show_password.xml\": {\n      \"Size\": 660\n    },\n    \"res/drawable/m3_bottom_sheet_drag_handle.xml\": {\n      \"Size\": 628\n    },\n    \"res/drawable/m3_password_eye.xml\": {\n      \"Size\": 816\n    },\n    \"res/drawable/m3_tabs_line_indicator.xml\": {\n      \"Size\": 480\n    },\n    \"res/drawable/m3_tabs_rounded_line_indicator.xml\": {\n      \"Size\": 956\n    },\n    \"res/drawable/material_ic_calendar_black_24dp.xml\": {\n      \"Size\": 696\n    },\n    \"res/drawable/material_ic_clear_black_24dp.xml\": {\n      \"Size\": 752\n    },\n    \"res/drawable/material_ic_edit_black_24dp.xml\": {\n      \"Size\": 716\n    },\n    \"res/drawable/material_ic_keyboard_arrow_left_black_24dp.xml\": {\n      \"Size\": 712\n    },\n    \"res/drawable/material_ic_keyboard_arrow_right_black_24dp.xml\": {\n      \"Size\": 700\n    },\n    \"res/drawable/material_ic_menu_arrow_down_black_24dp.xml\": {\n      \"Size\": 648\n    },\n    \"res/drawable/material_ic_menu_arrow_up_black_24dp.xml\": {\n      \"Size\": 648\n    },\n    \"res/drawable/maui_splash_image.xml\": {\n      \"Size\": 488\n    },\n    \"res/drawable/mtrl_bottomsheet_drag_handle.xml\": {\n      \"Size\": 628\n    },\n    \"res/drawable/mtrl_checkbox_button_checked_unchecked.xml\": {\n      \"Size\": 724\n    },\n    \"res/drawable/mtrl_checkbox_button_icon_checked_indeterminate.xml\": {\n      \"Size\": 524\n    },\n    \"res/drawable/mtrl_checkbox_button_icon_checked_unchecked.xml\": {\n      \"Size\": 724\n    },\n    \"res/drawable/mtrl_checkbox_button_icon_indeterminate_checked.xml\": {\n      \"Size\": 524\n    },\n    \"res/drawable/mtrl_checkbox_button_icon_indeterminate_unchecked.xml\": {\n      \"Size\": 724\n    },\n    \"res/drawable/mtrl_checkbox_button_icon_unchecked_checked.xml\": {\n      \"Size\": 724\n    },\n    \"res/drawable/mtrl_checkbox_button_icon_unchecked_indeterminate.xml\": {\n      \"Size\": 724\n    },\n    \"res/drawable/mtrl_checkbox_button_icon.xml\": {\n      \"Size\": 1572\n    },\n    \"res/drawable/mtrl_checkbox_button_unchecked_checked.xml\": {\n      \"Size\": 724\n    },\n    \"res/drawable/mtrl_checkbox_button.xml\": {\n      \"Size\": 1332\n    },\n    \"res/drawable/mtrl_dialog_background.xml\": {\n      \"Size\": 716\n    },\n    \"res/drawable/mtrl_dropdown_arrow.xml\": {\n      \"Size\": 464\n    },\n    \"res/drawable/mtrl_ic_arrow_drop_down.xml\": {\n      \"Size\": 564\n    },\n    \"res/drawable/mtrl_ic_arrow_drop_up.xml\": {\n      \"Size\": 564\n    },\n    \"res/drawable/mtrl_ic_cancel.xml\": {\n      \"Size\": 724\n    },\n    \"res/drawable/mtrl_ic_check_mark.xml\": {\n      \"Size\": 744\n    },\n    \"res/drawable/mtrl_ic_checkbox_checked.xml\": {\n      \"Size\": 904\n    },\n    \"res/drawable/mtrl_ic_checkbox_unchecked.xml\": {\n      \"Size\": 612\n    },\n    \"res/drawable/mtrl_ic_error.xml\": {\n      \"Size\": 644\n    },\n    \"res/drawable/mtrl_ic_indeterminate.xml\": {\n      \"Size\": 744\n    },\n    \"res/drawable/mtrl_popupmenu_background.xml\": {\n      \"Size\": 740\n    },\n    \"res/drawable/mtrl_switch_thumb_checked_pressed.xml\": {\n      \"Size\": 524\n    },\n    \"res/drawable/mtrl_switch_thumb_checked_unchecked.xml\": {\n      \"Size\": 784\n    },\n    \"res/drawable/mtrl_switch_thumb_checked.xml\": {\n      \"Size\": 744\n    },\n    \"res/drawable/mtrl_switch_thumb_pressed_checked.xml\": {\n      \"Size\": 524\n    },\n    \"res/drawable/mtrl_switch_thumb_pressed_unchecked.xml\": {\n      \"Size\": 524\n    },\n    \"res/drawable/mtrl_switch_thumb_pressed.xml\": {\n      \"Size\": 744\n    },\n    \"res/drawable/mtrl_switch_thumb_unchecked_checked.xml\": {\n      \"Size\": 784\n    },\n    \"res/drawable/mtrl_switch_thumb_unchecked_pressed.xml\": {\n      \"Size\": 524\n    },\n    \"res/drawable/mtrl_switch_thumb_unchecked.xml\": {\n      \"Size\": 744\n    },\n    \"res/drawable/mtrl_switch_thumb.xml\": {\n      \"Size\": 2004\n    },\n    \"res/drawable/mtrl_switch_track_decoration.xml\": {\n      \"Size\": 636\n    },\n    \"res/drawable/mtrl_switch_track.xml\": {\n      \"Size\": 588\n    },\n    \"res/drawable/mtrl_tabs_default_indicator.xml\": {\n      \"Size\": 628\n    },\n    \"res/drawable/navigation_empty_icon.xml\": {\n      \"Size\": 516\n    },\n    \"res/drawable/notification_bg_low.xml\": {\n      \"Size\": 532\n    },\n    \"res/drawable/notification_bg.xml\": {\n      \"Size\": 532\n    },\n    \"res/drawable/notification_icon_background.xml\": {\n      \"Size\": 372\n    },\n    \"res/drawable/notification_tile_bg.xml\": {\n      \"Size\": 304\n    },\n    \"res/drawable/test_level_drawable.xml\": {\n      \"Size\": 448\n    },\n    \"res/drawable/tooltip_frame_dark.xml\": {\n      \"Size\": 484\n    },\n    \"res/drawable/tooltip_frame_light.xml\": {\n      \"Size\": 484\n    },\n    \"res/interpolator-v21/m3_sys_motion_easing_emphasized_accelerate.xml\": {\n      \"Size\": 400\n    },\n    \"res/interpolator-v21/m3_sys_motion_easing_emphasized_decelerate.xml\": {\n      \"Size\": 400\n    },\n    \"res/interpolator-v21/m3_sys_motion_easing_emphasized.xml\": {\n      \"Size\": 280\n    },\n    \"res/interpolator-v21/m3_sys_motion_easing_linear.xml\": {\n      \"Size\": 400\n    },\n    \"res/interpolator-v21/m3_sys_motion_easing_standard_accelerate.xml\": {\n      \"Size\": 400\n    },\n    \"res/interpolator-v21/m3_sys_motion_easing_standard_decelerate.xml\": {\n      \"Size\": 400\n    },\n    \"res/interpolator-v21/m3_sys_motion_easing_standard.xml\": {\n      \"Size\": 400\n    },\n    \"res/interpolator-v21/mtrl_fast_out_linear_in.xml\": {\n      \"Size\": 400\n    },\n    \"res/interpolator-v21/mtrl_fast_out_slow_in.xml\": {\n      \"Size\": 400\n    },\n    \"res/interpolator-v21/mtrl_linear_out_slow_in.xml\": {\n      \"Size\": 400\n    },\n    \"res/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_0.xml\": {\n      \"Size\": 316\n    },\n    \"res/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_1.xml\": {\n      \"Size\": 328\n    },\n    \"res/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_0.xml\": {\n      \"Size\": 316\n    },\n    \"res/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_1.xml\": {\n      \"Size\": 328\n    },\n    \"res/interpolator/btn_radio_to_off_mtrl_animation_interpolator_0.xml\": {\n      \"Size\": 320\n    },\n    \"res/interpolator/btn_radio_to_on_mtrl_animation_interpolator_0.xml\": {\n      \"Size\": 320\n    },\n    \"res/interpolator/fast_out_slow_in.xml\": {\n      \"Size\": 400\n    },\n    \"res/interpolator/mtrl_linear.xml\": {\n      \"Size\": 132\n    },\n    \"res/layout-land/material_clock_period_toggle_land.xml\": {\n      \"Size\": 1232\n    },\n    \"res/layout-land/material_timepicker.xml\": {\n      \"Size\": 1676\n    },\n    \"res/layout-land/mtrl_picker_header_dialog.xml\": {\n      \"Size\": 1532\n    },\n    \"res/layout-sw600dp-v13/design_layout_snackbar.xml\": {\n      \"Size\": 528\n    },\n    \"res/layout-sw600dp-v13/mtrl_layout_snackbar.xml\": {\n      \"Size\": 492\n    },\n    \"res/layout-v21/notification_action_tombstone.xml\": {\n      \"Size\": 1228\n    },\n    \"res/layout-v21/notification_action.xml\": {\n      \"Size\": 1052\n    },\n    \"res/layout-v21/notification_template_custom_big.xml\": {\n      \"Size\": 2456\n    },\n    \"res/layout-v21/notification_template_icon_group.xml\": {\n      \"Size\": 988\n    },\n    \"res/layout-v26/abc_screen_toolbar.xml\": {\n      \"Size\": 1560\n    },\n    \"res/layout-v26/mtrl_calendar_month.xml\": {\n      \"Size\": 744\n    },\n    \"res/layout-watch-v20/abc_alert_dialog_button_bar_material.xml\": {\n      \"Size\": 1208\n    },\n    \"res/layout-watch-v20/abc_alert_dialog_title_material.xml\": {\n      \"Size\": 1352\n    },\n    \"res/layout/abc_action_bar_title_item.xml\": {\n      \"Size\": 872\n    },\n    \"res/layout/abc_action_bar_up_container.xml\": {\n      \"Size\": 440\n    },\n    \"res/layout/abc_action_menu_item_layout.xml\": {\n      \"Size\": 768\n    },\n    \"res/layout/abc_action_menu_layout.xml\": {\n      \"Size\": 576\n    },\n    \"res/layout/abc_action_mode_bar.xml\": {\n      \"Size\": 464\n    },\n    \"res/layout/abc_action_mode_close_item_material.xml\": {\n      \"Size\": 840\n    },\n    \"res/layout/abc_activity_chooser_view_list_item.xml\": {\n      \"Size\": 1304\n    },\n    \"res/layout/abc_activity_chooser_view.xml\": {\n      \"Size\": 1684\n    },\n    \"res/layout/abc_alert_dialog_button_bar_material.xml\": {\n      \"Size\": 1584\n    },\n    \"res/layout/abc_alert_dialog_material.xml\": {\n      \"Size\": 2648\n    },\n    \"res/layout/abc_alert_dialog_title_material.xml\": {\n      \"Size\": 1560\n    },\n    \"res/layout/abc_cascading_menu_item_layout.xml\": {\n      \"Size\": 1868\n    },\n    \"res/layout/abc_dialog_title_material.xml\": {\n      \"Size\": 1116\n    },\n    \"res/layout/abc_expanded_menu_layout.xml\": {\n      \"Size\": 388\n    },\n    \"res/layout/abc_list_menu_item_checkbox.xml\": {\n      \"Size\": 528\n    },\n    \"res/layout/abc_list_menu_item_icon.xml\": {\n      \"Size\": 780\n    },\n    \"res/layout/abc_list_menu_item_layout.xml\": {\n      \"Size\": 1396\n    },\n    \"res/layout/abc_list_menu_item_radio.xml\": {\n      \"Size\": 532\n    },\n    \"res/layout/abc_popup_menu_header_item_layout.xml\": {\n      \"Size\": 848\n    },\n    \"res/layout/abc_popup_menu_item_layout.xml\": {\n      \"Size\": 2072\n    },\n    \"res/layout/abc_screen_content_include.xml\": {\n      \"Size\": 548\n    },\n    \"res/layout/abc_screen_simple_overlay_action_mode.xml\": {\n      \"Size\": 792\n    },\n    \"res/layout/abc_screen_simple.xml\": {\n      \"Size\": 832\n    },\n    \"res/layout/abc_screen_toolbar.xml\": {\n      \"Size\": 1504\n    },\n    \"res/layout/abc_search_dropdown_item_icons_2line.xml\": {\n      \"Size\": 1916\n    },\n    \"res/layout/abc_search_view.xml\": {\n      \"Size\": 3472\n    },\n    \"res/layout/abc_select_dialog_material.xml\": {\n      \"Size\": 1020\n    },\n    \"res/layout/abc_tooltip.xml\": {\n      \"Size\": 1056\n    },\n    \"res/layout/custom_dialog.xml\": {\n      \"Size\": 612\n    },\n    \"res/layout/design_bottom_navigation_item.xml\": {\n      \"Size\": 1860\n    },\n    \"res/layout/design_bottom_sheet_dialog.xml\": {\n      \"Size\": 1224\n    },\n    \"res/layout/design_layout_snackbar_include.xml\": {\n      \"Size\": 1444\n    },\n    \"res/layout/design_layout_snackbar.xml\": {\n      \"Size\": 528\n    },\n    \"res/layout/design_layout_tab_icon.xml\": {\n      \"Size\": 408\n    },\n    \"res/layout/design_layout_tab_text.xml\": {\n      \"Size\": 436\n    },\n    \"res/layout/design_menu_item_action_area.xml\": {\n      \"Size\": 320\n    },\n    \"res/layout/design_navigation_item_header.xml\": {\n      \"Size\": 440\n    },\n    \"res/layout/design_navigation_item_separator.xml\": {\n      \"Size\": 472\n    },\n    \"res/layout/design_navigation_item_subheader.xml\": {\n      \"Size\": 564\n    },\n    \"res/layout/design_navigation_item.xml\": {\n      \"Size\": 636\n    },\n    \"res/layout/design_navigation_menu_item.xml\": {\n      \"Size\": 856\n    },\n    \"res/layout/design_navigation_menu.xml\": {\n      \"Size\": 528\n    },\n    \"res/layout/design_text_input_end_icon.xml\": {\n      \"Size\": 656\n    },\n    \"res/layout/design_text_input_start_icon.xml\": {\n      \"Size\": 652\n    },\n    \"res/layout/ime_base_split_test_activity.xml\": {\n      \"Size\": 364\n    },\n    \"res/layout/ime_secondary_split_test_activity.xml\": {\n      \"Size\": 876\n    },\n    \"res/layout/m3_alert_dialog_actions.xml\": {\n      \"Size\": 1584\n    },\n    \"res/layout/m3_alert_dialog_title.xml\": {\n      \"Size\": 956\n    },\n    \"res/layout/m3_alert_dialog.xml\": {\n      \"Size\": 2720\n    },\n    \"res/layout/m3_auto_complete_simple_item.xml\": {\n      \"Size\": 612\n    },\n    \"res/layout/m3_side_sheet_dialog.xml\": {\n      \"Size\": 1180\n    },\n    \"res/layout/material_chip_input_combo.xml\": {\n      \"Size\": 372\n    },\n    \"res/layout/material_clock_display_divider.xml\": {\n      \"Size\": 444\n    },\n    \"res/layout/material_clock_display.xml\": {\n      \"Size\": 796\n    },\n    \"res/layout/material_clock_period_toggle.xml\": {\n      \"Size\": 1220\n    },\n    \"res/layout/material_clockface_textview.xml\": {\n      \"Size\": 476\n    },\n    \"res/layout/material_clockface_view.xml\": {\n      \"Size\": 1012\n    },\n    \"res/layout/material_radial_view_group.xml\": {\n      \"Size\": 768\n    },\n    \"res/layout/material_textinput_timepicker.xml\": {\n      \"Size\": 720\n    },\n    \"res/layout/material_time_chip.xml\": {\n      \"Size\": 380\n    },\n    \"res/layout/material_time_input.xml\": {\n      \"Size\": 956\n    },\n    \"res/layout/material_timepicker_dialog.xml\": {\n      \"Size\": 3184\n    },\n    \"res/layout/material_timepicker_textinput_display.xml\": {\n      \"Size\": 728\n    },\n    \"res/layout/material_timepicker.xml\": {\n      \"Size\": 1608\n    },\n    \"res/layout/mtrl_alert_dialog_actions.xml\": {\n      \"Size\": 1764\n    },\n    \"res/layout/mtrl_alert_dialog_title.xml\": {\n      \"Size\": 956\n    },\n    \"res/layout/mtrl_alert_dialog.xml\": {\n      \"Size\": 2476\n    },\n    \"res/layout/mtrl_alert_select_dialog_item.xml\": {\n      \"Size\": 588\n    },\n    \"res/layout/mtrl_alert_select_dialog_multichoice.xml\": {\n      \"Size\": 940\n    },\n    \"res/layout/mtrl_alert_select_dialog_singlechoice.xml\": {\n      \"Size\": 940\n    },\n    \"res/layout/mtrl_auto_complete_simple_item.xml\": {\n      \"Size\": 612\n    },\n    \"res/layout/mtrl_calendar_day_of_week.xml\": {\n      \"Size\": 352\n    },\n    \"res/layout/mtrl_calendar_day.xml\": {\n      \"Size\": 352\n    },\n    \"res/layout/mtrl_calendar_days_of_week.xml\": {\n      \"Size\": 436\n    },\n    \"res/layout/mtrl_calendar_horizontal.xml\": {\n      \"Size\": 1176\n    },\n    \"res/layout/mtrl_calendar_month_labeled.xml\": {\n      \"Size\": 728\n    },\n    \"res/layout/mtrl_calendar_month_navigation.xml\": {\n      \"Size\": 1748\n    },\n    \"res/layout/mtrl_calendar_month.xml\": {\n      \"Size\": 688\n    },\n    \"res/layout/mtrl_calendar_months.xml\": {\n      \"Size\": 428\n    },\n    \"res/layout/mtrl_calendar_vertical.xml\": {\n      \"Size\": 740\n    },\n    \"res/layout/mtrl_calendar_year.xml\": {\n      \"Size\": 352\n    },\n    \"res/layout/mtrl_layout_snackbar_include.xml\": {\n      \"Size\": 952\n    },\n    \"res/layout/mtrl_layout_snackbar.xml\": {\n      \"Size\": 492\n    },\n    \"res/layout/mtrl_navigation_rail_item.xml\": {\n      \"Size\": 1860\n    },\n    \"res/layout/mtrl_picker_actions.xml\": {\n      \"Size\": 984\n    },\n    \"res/layout/mtrl_picker_dialog.xml\": {\n      \"Size\": 1172\n    },\n    \"res/layout/mtrl_picker_fullscreen.xml\": {\n      \"Size\": 880\n    },\n    \"res/layout/mtrl_picker_header_dialog.xml\": {\n      \"Size\": 1492\n    },\n    \"res/layout/mtrl_picker_header_fullscreen.xml\": {\n      \"Size\": 2800\n    },\n    \"res/layout/mtrl_picker_header_selection_text.xml\": {\n      \"Size\": 712\n    },\n    \"res/layout/mtrl_picker_header_title_text.xml\": {\n      \"Size\": 624\n    },\n    \"res/layout/mtrl_picker_header_toggle.xml\": {\n      \"Size\": 528\n    },\n    \"res/layout/mtrl_picker_text_input_date_range.xml\": {\n      \"Size\": 1580\n    },\n    \"res/layout/mtrl_picker_text_input_date.xml\": {\n      \"Size\": 984\n    },\n    \"res/layout/mtrl_search_bar.xml\": {\n      \"Size\": 488\n    },\n    \"res/layout/mtrl_search_view.xml\": {\n      \"Size\": 3424\n    },\n    \"res/layout/notification_template_part_chronometer.xml\": {\n      \"Size\": 440\n    },\n    \"res/layout/notification_template_part_time.xml\": {\n      \"Size\": 440\n    },\n    \"res/layout/select_dialog_item_material.xml\": {\n      \"Size\": 640\n    },\n    \"res/layout/select_dialog_multichoice_material.xml\": {\n      \"Size\": 864\n    },\n    \"res/layout/select_dialog_singlechoice_material.xml\": {\n      \"Size\": 864\n    },\n    \"res/layout/support_simple_spinner_dropdown_item.xml\": {\n      \"Size\": 464\n    },\n    \"res/mipmap-anydpi-v26/appicon_round.xml\": {\n      \"Size\": 548\n    },\n    \"res/mipmap-anydpi-v26/appicon.xml\": {\n      \"Size\": 548\n    },\n    \"res/mipmap-hdpi-v4/appicon_background.png\": {\n      \"Size\": 120\n    },\n    \"res/mipmap-hdpi-v4/appicon_foreground.png\": {\n      \"Size\": 1243\n    },\n    \"res/mipmap-hdpi-v4/appicon_round.png\": {\n      \"Size\": 1734\n    },\n    \"res/mipmap-hdpi-v4/appicon.png\": {\n      \"Size\": 1073\n    },\n    \"res/mipmap-mdpi-v4/appicon_background.png\": {\n      \"Size\": 106\n    },\n    \"res/mipmap-mdpi-v4/appicon_foreground.png\": {\n      \"Size\": 1129\n    },\n    \"res/mipmap-mdpi-v4/appicon_round.png\": {\n      \"Size\": 1523\n    },\n    \"res/mipmap-mdpi-v4/appicon.png\": {\n      \"Size\": 741\n    },\n    \"res/mipmap-xhdpi-v4/appicon_background.png\": {\n      \"Size\": 140\n    },\n    \"res/mipmap-xhdpi-v4/appicon_foreground.png\": {\n      \"Size\": 1723\n    },\n    \"res/mipmap-xhdpi-v4/appicon_round.png\": {\n      \"Size\": 2030\n    },\n    \"res/mipmap-xhdpi-v4/appicon.png\": {\n      \"Size\": 875\n    },\n    \"res/mipmap-xxhdpi-v4/appicon_background.png\": {\n      \"Size\": 197\n    },\n    \"res/mipmap-xxhdpi-v4/appicon_foreground.png\": {\n      \"Size\": 2142\n    },\n    \"res/mipmap-xxhdpi-v4/appicon_round.png\": {\n      \"Size\": 4317\n    },\n    \"res/mipmap-xxhdpi-v4/appicon.png\": {\n      \"Size\": 1336\n    },\n    \"res/mipmap-xxxhdpi-v4/appicon_background.png\": {\n      \"Size\": 275\n    },\n    \"res/mipmap-xxxhdpi-v4/appicon_foreground.png\": {\n      \"Size\": 3023\n    },\n    \"res/mipmap-xxxhdpi-v4/appicon_round.png\": {\n      \"Size\": 5567\n    },\n    \"res/mipmap-xxxhdpi-v4/appicon.png\": {\n      \"Size\": 1455\n    },\n    \"res/xml/splits0.xml\": {\n      \"Size\": 8404\n    },\n    \"resources.arsc\": {\n      \"Size\": 1021484\n    }\n  },\n  \"PackageSize\": 11385847\n}"
  },
  {
    "path": "sizes/startup.md",
    "content": "# Startup times\n\nJust recording these over time. A `Release` build on a Pixel 5 device.\n\nSpice 🌶:\n```log\n06-01 14:43:20.843  2084  2346 I ActivityTaskManager: Displayed com.companyname.HeadToHeadSpice/crc6421a68941fd0c4613.MainActivity: +247ms\n06-01 14:43:22.248  2084  2346 I ActivityTaskManager: Displayed com.companyname.HeadToHeadSpice/crc6421a68941fd0c4613.MainActivity: +249ms\n06-01 14:43:23.641  2084  2346 I ActivityTaskManager: Displayed com.companyname.HeadToHeadSpice/crc6421a68941fd0c4613.MainActivity: +237ms\n06-01 14:43:25.040  2084  2346 I ActivityTaskManager: Displayed com.companyname.HeadToHeadSpice/crc6421a68941fd0c4613.MainActivity: +255ms\n06-01 14:43:26.453  2084  2346 I ActivityTaskManager: Displayed com.companyname.HeadToHeadSpice/crc6421a68941fd0c4613.MainActivity: +247ms\n06-01 14:43:27.848  2084  2346 I ActivityTaskManager: Displayed com.companyname.HeadToHeadSpice/crc6421a68941fd0c4613.MainActivity: +239ms\n06-01 14:43:29.267  2084  2346 I ActivityTaskManager: Displayed com.companyname.HeadToHeadSpice/crc6421a68941fd0c4613.MainActivity: +247ms\n06-01 14:43:30.654  2084  2346 I ActivityTaskManager: Displayed com.companyname.HeadToHeadSpice/crc6421a68941fd0c4613.MainActivity: +231ms\n06-01 14:43:32.073  2084  2346 I ActivityTaskManager: Displayed com.companyname.HeadToHeadSpice/crc6421a68941fd0c4613.MainActivity: +248ms\n06-01 14:43:33.497  2084  2346 I ActivityTaskManager: Displayed com.companyname.HeadToHeadSpice/crc6421a68941fd0c4613.MainActivity: +251ms\nAverage(ms): 245.1\nStd Err(ms): 2.28254244210266\nStd Dev(ms): 7.21803297304743\n\nSize: 7018603 com.companyname.HeadToHeadSpice-Signed.apk\n```\n\n.NET MAUI:\n```log\n06-01 14:50:15.070  2084  2346 I ActivityTaskManager: Displayed com.companyname.headtoheadmaui/crc649f845fb8d5de61df.MainActivity: +543ms\n06-01 14:50:16.763  2084  2346 I ActivityTaskManager: Displayed com.companyname.headtoheadmaui/crc649f845fb8d5de61df.MainActivity: +539ms\n06-01 14:50:18.466  2084  2346 I ActivityTaskManager: Displayed com.companyname.headtoheadmaui/crc649f845fb8d5de61df.MainActivity: +547ms\n06-01 14:50:20.183  2084  2346 I ActivityTaskManager: Displayed com.companyname.headtoheadmaui/crc649f845fb8d5de61df.MainActivity: +562ms\n06-01 14:50:21.872  2084  2346 I ActivityTaskManager: Displayed com.companyname.headtoheadmaui/crc649f845fb8d5de61df.MainActivity: +539ms\n06-01 14:50:23.559  2084  2346 I ActivityTaskManager: Displayed com.companyname.headtoheadmaui/crc649f845fb8d5de61df.MainActivity: +534ms\n06-01 14:50:25.238  2084  2346 I ActivityTaskManager: Displayed com.companyname.headtoheadmaui/crc649f845fb8d5de61df.MainActivity: +543ms\n06-01 14:50:26.934  2084  2346 I ActivityTaskManager: Displayed com.companyname.headtoheadmaui/crc649f845fb8d5de61df.MainActivity: +542ms\n06-01 14:50:28.659  2084  2346 I ActivityTaskManager: Displayed com.companyname.headtoheadmaui/crc649f845fb8d5de61df.MainActivity: +562ms\n06-01 14:50:30.361  2084  2346 I ActivityTaskManager: Displayed com.companyname.headtoheadmaui/crc649f845fb8d5de61df.MainActivity: +542ms\nAverage(ms): 545.3\nStd Err(ms): 2.98161030317511\nStd Dev(ms): 9.42867965305853\n\nSize: 12255930 com.companyname.headtoheadmaui-Signed.apk\n```\n\n`dotnet new spice-blazor`:\n```log\n06-01 15:28:30.423  2084  2346 I ActivityTaskManager: Displayed com.companyname.spice.blazor/crc64ea1cd60bbe11594e.MainActivity: +396ms\n06-01 15:28:31.995  2084  2346 I ActivityTaskManager: Displayed com.companyname.spice.blazor/crc64ea1cd60bbe11594e.MainActivity: +414ms\n06-01 15:28:33.580  2084  2346 I ActivityTaskManager: Displayed com.companyname.spice.blazor/crc64ea1cd60bbe11594e.MainActivity: +417ms\n06-01 15:28:35.170  2084  2346 I ActivityTaskManager: Displayed com.companyname.spice.blazor/crc64ea1cd60bbe11594e.MainActivity: +431ms\n06-01 15:28:36.771  2084  2346 I ActivityTaskManager: Displayed com.companyname.spice.blazor/crc64ea1cd60bbe11594e.MainActivity: +426ms\n06-01 15:28:38.362  2084  2346 I ActivityTaskManager: Displayed com.companyname.spice.blazor/crc64ea1cd60bbe11594e.MainActivity: +408ms\n06-01 15:28:39.930  2084  2346 I ActivityTaskManager: Displayed com.companyname.spice.blazor/crc64ea1cd60bbe11594e.MainActivity: +420ms\n06-01 15:28:41.509  2084  2346 I ActivityTaskManager: Displayed com.companyname.spice.blazor/crc64ea1cd60bbe11594e.MainActivity: +432ms\n06-01 15:28:43.059  2084  2346 I ActivityTaskManager: Displayed com.companyname.spice.blazor/crc64ea1cd60bbe11594e.MainActivity: +394ms\n06-01 15:28:44.615  2084  2346 I ActivityTaskManager: Displayed com.companyname.spice.blazor/crc64ea1cd60bbe11594e.MainActivity: +412ms\nAverage(ms): 415\nStd Err(ms): 4.15799096787005\nStd Dev(ms): 13.1487219488773\n```\n\n`dotnet new maui-blazor`:\n```log\n06-01 15:51:14.648  2084  2346 I ActivityTaskManager: Displayed com.companyname.foo/crc64808a40cc7e533249.MainActivity: +653ms\n06-01 15:51:16.511  2084  2346 I ActivityTaskManager: Displayed com.companyname.foo/crc64808a40cc7e533249.MainActivity: +641ms\n06-01 15:51:18.327  2084  2346 I ActivityTaskManager: Displayed com.companyname.foo/crc64808a40cc7e533249.MainActivity: +640ms\n06-01 15:51:20.086  2084  2346 I ActivityTaskManager: Displayed com.companyname.foo/crc64808a40cc7e533249.MainActivity: +628ms\n06-01 15:51:21.885  2084  2346 I ActivityTaskManager: Displayed com.companyname.foo/crc64808a40cc7e533249.MainActivity: +631ms\n06-01 15:51:23.650  2084  2346 I ActivityTaskManager: Displayed com.companyname.foo/crc64808a40cc7e533249.MainActivity: +612ms\n06-01 15:51:25.438  2084  2346 I ActivityTaskManager: Displayed com.companyname.foo/crc64808a40cc7e533249.MainActivity: +635ms\n06-01 15:51:27.243  2084  2346 I ActivityTaskManager: Displayed com.companyname.foo/crc64808a40cc7e533249.MainActivity: +643ms\n06-01 15:51:29.037  2084  2346 I ActivityTaskManager: Displayed com.companyname.foo/crc64808a40cc7e533249.MainActivity: +633ms\n06-01 15:51:30.847  2084  2346 I ActivityTaskManager: Displayed com.companyname.foo/crc64808a40cc7e533249.MainActivity: +650ms\nAverage(ms): 636.6\nStd Err(ms): 3.7214095298541\nStd Dev(ms): 11.7681302205953\n```\n"
  },
  {
    "path": "spice.slnx",
    "content": "<Solution>\n  <Folder Name=\"/src/\">\n    <Project Path=\"src/Spice.Templates/Spice.Templates.csproj\" />\n    <Project Path=\"src/Spice/Spice.csproj\" />\n  </Folder>\n  <Folder Name=\"/tests/\">\n    <Project Path=\"tests/Spice.Tests/Spice.Tests.csproj\" />\n  </Folder>\n</Solution>\n"
  },
  {
    "path": "src/ProfiledAot/Directory.Build.props",
    "content": "<Project>\n  <PropertyGroup>\n    <Configuration>Release</Configuration>\n    <AndroidNeedsInternetPermission>true</AndroidNeedsInternetPermission>\n    <AndroidEnableAotProfiler>true</AndroidEnableAotProfiler>\n    <RunAOTCompilation>false</RunAOTCompilation>\n  </PropertyGroup>\n  \n  <Import Project=\"../../Directory.Build.props\" />\n</Project>"
  },
  {
    "path": "src/ProfiledAot/Directory.Build.targets",
    "content": "<Project>\n  <PropertyGroup>\n    <AndroidPackageFormat>apk</AndroidPackageFormat>\n    <AndroidUseDefaultAotProfile>false</AndroidUseDefaultAotProfile>\n    <MauiUseDefaultAotProfile>false</MauiUseDefaultAotProfile>\n  </PropertyGroup>\n  <ItemGroup>\n    <AndroidAotProfile Include=\"custom.aprof\" />\n    <PackageReference Include=\"Mono.AotProfiler.Android\" Version=\"7.0.0-preview1\" />\n  </ItemGroup>\n  <PropertyGroup>\n    <RecordDependsOn>\n      Clean;\n      _ClearSystemProperties;\n      BuildAndStartAotProfiling;\n      _Sleep;\n      FinishAotProfiling;\n      _StripAppMethods;\n      _SaveMethodNames;\n    </RecordDependsOn>\n  </PropertyGroup>\n  <Target Name=\"Record\" DependsOnTargets=\"$(RecordDependsOn)\">\n    <Message Importance=\"High\" Text=\"Success! See changes in: $(MSBuildThisFileDirectory)../Spice/MSBuild/$(App).aotprofile\" />\n  </Target>\n  <Target Name=\"_ClearSystemProperties\" DependsOnTargets=\"_ResolveMonoAndroidSdks\">\n    <!-- Clear debug.mono.log in case it was set -->\n    <Exec Command=\"&quot;$(AdbToolPath)adb&quot; shell &quot;setprop debug.mono.log ''&quot;\" />\n  </Target>\n  <Target Name=\"_Sleep\">\n    <Sleep Delay=\"5000\" />\n  </Target>\n  <UsingTask TaskName=\"Sleep\"\n      TaskFactory=\"RoslynCodeTaskFactory\"\n      AssemblyFile=\"$(MSBuildToolsPath)\\Microsoft.Build.Tasks.Core.dll\">\n    <ParameterGroup>\n      <Delay ParameterType=\"System.Int32\" Required=\"true\" />\n    </ParameterGroup>\n    <Task>\n      <Using Namespace=\"System.IO\" />\n      <Code Type=\"Fragment\" Language=\"cs\">\n        <![CDATA[\n          System.Threading.Thread.Sleep(this.Delay);\n        ]]>\n      </Code>\n    </Task>\n  </UsingTask>\n  <Target Name=\"_StripAppMethods\">\n    <!-- This removes spicetest.dll from the profile, as user's apps will have a different name -->\n    <Exec Command=\"dotnet &quot;$(AotProfileToolPath)&quot; -sd --filter-module=&quot;^(?!$(App.Replace('-', ''))test).+&quot; &quot;$(MSBuildProjectDirectory)/custom.aprof&quot; -o &quot;$(MSBuildThisFileDirectory)../Spice/MSBuild/$(App).aotprofile&quot;\" />\n  </Target>\n  <Target Name=\"_SaveMethodNames\">\n    <!-- This saves all the method names to a text file, so we can see a diff over time -->\n    <Exec Command=\"dotnet &quot;$(AotProfileToolPath)&quot; -m &quot;$(MSBuildThisFileDirectory)../Spice/MSBuild/$(App).aotprofile&quot; > &quot;$(MSBuildThisFileDirectory)../Spice/MSBuild/$(App).aotprofile.txt&quot;\" />\n  </Target>\n</Project>"
  },
  {
    "path": "src/ProfiledAot/README.md",
    "content": "# Profiled AOT support for Android\n\nThis is based on the NuGet package found here:\n\nhttps://github.com/jonathanpeppers/Mono.Profiler.Android#usage-of-the-aot-profiler\n\n## Updating Profiles\n\nBuild this repo with `dotnet build -c Release` and install the `spice`\ntemplates:\n\n```sh\ndotnet new install bin/Release/Spice.Templates.*.nupkg\n```\n\nThen run the following command:\n\n```sh\ndotnet build src/ProfiledAot/build.proj -p:App=spice\n```\n\nFor `spice-blazor`:\n\n```sh\ndotnet build src/ProfiledAot/build.proj -p:App=spice-blazor\n```\n\nYou can also use `-r android-x64`, if you'd prefer an x86_64 emulator.\n\nSee further details about this at:\n\nhttps://github.com/xamarin/xamarin-android/edit/main/src/profiled-aot/README.md"
  },
  {
    "path": "src/ProfiledAot/build.proj",
    "content": "<Project DefaultTargets=\"Record\">\n  <PropertyGroup>\n    <!-- The template name -->\n    <App Condition=\" '$(App)' == '' \">spice</App>\n    <RuntimeIdentifier Condition=\" '$(RuntimeIdentifier)' == '' \">android-arm64</RuntimeIdentifier>\n    <Intermediate>obj/$(App.Replace('-', ''))test/</Intermediate>\n    <CSProj>$(Intermediate)$(App.Replace('-', ''))test.csproj</CSProj>\n  </PropertyGroup>\n  <Target Name=\"Record\">\n    <RemoveDir Directories=\"$(Intermediate)\" />\n    <Exec Command=\"dotnet new $(App) -o $(Intermediate)\" EnvironmentVariables=\"DOTNET_MULTILEVEL_LOOKUP=0\" />\n    <!-- Copy replacement files-->\n    <ItemGroup>\n      <_FilesToCopy Include=\"shared/*\" />\n      <_FilesToCopy Include=\"$(App)/*\" />\n    </ItemGroup>\n    <Copy SourceFiles=\"@(_FilesToCopy)\" DestinationFolder=\"$(Intermediate)\" />\n    <!-- Restore as a separate step due to: https://github.com/dotnet/sdk/issues/21877 -->\n    <MSBuild Projects=\"$(CSProj)\" Targets=\"Restore\" />\n    <MSBuild Projects=\"$(CSProj)\" Targets=\"Record\" Properties=\"App=$(App);TargetFramework=net10.0-android;RuntimeIdentifier=$(RuntimeIdentifier)\" />\n  </Target>\n</Project>"
  },
  {
    "path": "src/ProfiledAot/shared/nuget.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <packageSources>\n    <clear />\n    <add key=\"local\" value=\"..\\..\\..\\..\\bin\\Release\" />\n    <add key=\"nuget\" value=\"https://api.nuget.org/v3/index.json\" />\n  </packageSources>\n  <config>\n    <add key=\"globalPackagesFolder\" value=\"packages\" />\n  </config>\n</configuration>"
  },
  {
    "path": "src/Spice/Blazor/BlazorWebView.cs",
    "content": "﻿using System.Collections.Specialized;\nusing System.Collections.ObjectModel;\n\nusing Microsoft.AspNetCore.Components.Web;\n\nnamespace Spice;\n\n/// <summary>\n/// A \"web view\" for rendering Blazor/.razor content on each platform.\n/// Android -> Android.Webkit.WebView\n/// iOS -> WebKit.WKWebView\n/// </summary>\npublic partial class BlazorWebView : WebView\n{\n\tinternal const string AppHostAddress = \"0.0.0.0\";\n\n\treadonly JSComponentConfigurationStore _jSComponents = new();\n\n\t/// <summary>\n\t/// Gets or sets the path to the HTML file to render.\n\t/// <para>This is an app relative path to the file such as <c>wwwroot\\index.html</c></para>\n\t/// </summary>\n\t[ObservableProperty]\n\tstring _hostPage = \"\";\n\n\t/// <summary>\n\t/// Gets or sets the path for initial navigation within the Blazor navigation context when the Blazor component is finished loading.\n\t/// </summary>\n\t[ObservableProperty]\n\tstring? _startPage;\n\n\t/// <summary>\n\t/// Gets a collection of <see cref=\"RootComponent\"/> items.\n\t/// </summary>\n\t[ObservableProperty]\n\tObservableCollection<RootComponent> _rootComponents = new();\n\n\t/// <summary>\n\t/// Gets or sets the path for initial navigation within the Blazor navigation context when the Blazor component is finished loading.\n\t/// </summary>\n\t[ObservableProperty]\n\tstring _startPath = \"/\";\n\n\t/// <summary>\n\t/// Called by the ctor\n\t/// </summary>\n\tvoid Initialize()\n\t{\n\t\tif (_rootComponents is not null)\n\t\t\t_rootComponents.CollectionChanged += OnCollectionChanged;\n\t}\n\n\t/// <summary>\n\t/// Called when HostPage or RootComponents change\n\t/// </summary>\n\tvoid LoadWebView()\n\t{\n\t\tif (string.IsNullOrEmpty(_hostPage) || _rootComponents?.Count == 0)\n\t\t\treturn;\n\n\t\t// We assume the host page is always in the root of the content directory, because it's\n\t\t// unclear there's any other use case. We can add more options later if so.\n\t\tvar contentRootDir = Path.GetDirectoryName(HostPage!) ?? string.Empty;\n\t\tvar hostPageRelativePath = Path.GetRelativePath(contentRootDir, HostPage!);\n\n\t\tLoadNativeWebView(contentRootDir, hostPageRelativePath);\n\t}\n\n\t/// <summary>\n\t/// Implemented in each platform\n\t/// </summary>\n\tpartial void LoadNativeWebView(string contentRootDir, string hostPageRelativePath);\n\n\tvoid OnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) => LoadWebView();\n\n\tpartial void OnHostPageChanged(string value) => LoadWebView();\n\n\tpartial void OnRootComponentsChanging(ObservableCollection<RootComponent> value)\n\t{\n\t\tif (_rootComponents is not null)\n\t\t\t_rootComponents.CollectionChanged -= OnCollectionChanged;\n\t}\n\n\tpartial void OnRootComponentsChanged(ObservableCollection<RootComponent> value)\n\t{\n\t\tif (value is not null)\n\t\t\tvalue.CollectionChanged += OnCollectionChanged;\n\n\t\tLoadWebView();\n\t}\n}"
  },
  {
    "path": "src/Spice/Blazor/SpiceDispatcher.cs",
    "content": "﻿using Microsoft.AspNetCore.Components;\n\nnamespace Spice;\n\ninternal partial class SpiceDispatcher\n{\n\tpublic static readonly SpiceDispatcher Instance = new();\n}"
  },
  {
    "path": "src/Spice/Blazor/SpiceServiceProvider.cs",
    "content": "﻿using Microsoft.Extensions.DependencyInjection;\n\nnamespace Spice;\n\n/// <summary>\n/// Implements IServiceProvider to make ASP.NET able to launch\n/// </summary>\ninternal class SpiceServiceProvider\n{\n\tpublic static readonly IServiceProvider Instance;\n\n\tstatic SpiceServiceProvider()\n\t{\n\t\tvar services = new ServiceCollection();\n\t\tservices.AddBlazorWebView();\n\t\tInstance = services.BuildServiceProvider();\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Blazor/UriExtensions.cs",
    "content": "﻿// From: https://github.com/dotnet/maui/blob/c8a6093ee805388732af8d75b437b099a301db22/src/BlazorWebView/src/Maui/Extensions/UriExtensions.cs\nnamespace Spice;\n\ninternal static class UriExtensions\n{\n\tinternal static bool IsBaseOfPage(this Uri baseUri, string? uriString)\n\t{\n\t\tif (Path.HasExtension(uriString))\n\t\t{\n\t\t\t// If the path ends in a file extension, it's not referring to a page.\n\t\t\treturn false;\n\t\t}\n\n\t\tvar uri = new Uri(uriString!);\n\t\treturn baseUri.IsBaseOf(uri);\n\t}\n\n\t// From: https://github.com/dotnet/maui/blob/c8a6093ee805388732af8d75b437b099a301db22/src/BlazorWebView/src/SharedSource/QueryStringHelper.cs\n\tpublic static string RemovePossibleQueryString(string? url)\n\t{\n\t\tif (string.IsNullOrEmpty(url))\n\t\t{\n\t\t\treturn string.Empty;\n\t\t}\n\t\tvar indexOfQueryString = url.IndexOf('?', StringComparison.Ordinal);\n\t\treturn (indexOfQueryString == -1)\n\t\t\t? url\n\t\t\t: url.Substring(0, indexOfQueryString);\n\t}\n}"
  },
  {
    "path": "src/Spice/Core/ActivityIndicator.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// Represents a loading spinner on screen. Set the IsRunning property to true to show the spinner.\n/// Android -> Android.Widget.ProgressBar (indeterminate)\n/// iOS -> UIKit.UIActivityIndicatorView\n/// </summary>\npublic partial class ActivityIndicator : View\n{\n\t/// <summary>\n\t/// Whether the activity indicator is running (showing the spinner)\n\t/// </summary>\n\t[ObservableProperty]\n\tbool _isRunning;\n\n\t/// <summary>\n\t/// Color of the activity indicator\n\t/// </summary>\n\t[ObservableProperty]\n\tColor? _color;\n\n\t/// <inheritdoc />\n\tprotected override void ApplyTheme(Theme theme)\n\t{\n\t\tbase.ApplyTheme(theme);\n\t\tif (CanApplyTheme((int)ThemeProperty.Color))\n\t\t\tColor = theme.AccentColor;\n\t}\n\n\tpartial void OnColorChanging(Color? value) => TrackExplicit((int)ThemeProperty.Color, value);\n}\n"
  },
  {
    "path": "src/Spice/Core/Application.cs",
    "content": "using System.ComponentModel;\n\nnamespace Spice;\n\n/// <summary>\n/// The root \"view\" of a Spice application. Set Main to a single view.\n/// </summary>\npublic partial class Application : View\n{\n\tbool _isSettingSystemTheme;\n\n\t/// <summary>\n\t/// The single, main \"view\" of this application\n\t/// </summary>\n\t[ObservableProperty]\n\tView? _main;\n\n\t/// <summary>\n\t/// The current theme. Setting this applies colors to the entire view tree\n\t/// and subscribes to live updates. Null means no theme — views keep their\n\t/// individually-set colors (backward compatible default).\n\t/// </summary>\n\t[ObservableProperty]\n\tTheme? _theme;\n\n\t/// <summary>\n\t/// When true, automatically sets Theme to Theme.Light or Theme.Dark\n\t/// based on the OS appearance, and updates live when the system\n\t/// appearance changes.\n\t/// </summary>\n\t[ObservableProperty]\n\tbool _useSystemTheme;\n\n\t/// <summary>\n\t/// Optional callback invoked when the system appearance changes.\n\t/// The bool parameter is true when the system switched to dark mode.\n\t/// Use this to swap custom themes based on OS appearance.\n\t/// </summary>\n\t[ObservableProperty]\n\tAction<bool>? _appearanceChanged;\n\n\tpartial void OnThemeChanging(Theme? value)\n\t{\n\t\tif (!_isSettingSystemTheme)\n\t\t\tUseSystemTheme = false;\n\t}\n\n\tpartial void OnThemeChanged(Theme? oldValue, Theme? newValue)\n\t{\n\t\tif (oldValue is not null)\n\t\t\toldValue.PropertyChanged -= OnThemePropertyChanged;\n\n\t\tif (newValue is not null)\n\t\t{\n\t\t\tnewValue.PropertyChanged += OnThemePropertyChanged;\n\t\t\tApplyThemeToTree(Main, newValue);\n\t\t}\n\t}\n\n\tpartial void OnMainChanged(View? oldValue, View? newValue)\n\t{\n\t\tif (newValue is not null && Theme is not null)\n\t\t\tApplyThemeToTree(newValue, Theme);\n\t}\n\n\tvoid OnThemePropertyChanged(object? sender, PropertyChangedEventArgs e)\n\t{\n\t\tif (Theme is not null)\n\t\t\tApplyThemeToTree(Main, Theme);\n\t}\n\n\tpartial void OnUseSystemThemeChanged(bool value)\n\t{\n\t\tif (value)\n\t\t{\n\t\t\tPlatformAppearance.Changed += OnPlatformAppearanceChanged;\n\t\t\t_isSettingSystemTheme = true;\n\t\t\tTheme = PlatformAppearance.IsDarkMode ? Theme.Dark : Theme.Light;\n\t\t\t_isSettingSystemTheme = false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tPlatformAppearance.Changed -= OnPlatformAppearanceChanged;\n\t\t}\n\t}\n\n\tvoid OnPlatformAppearanceChanged(bool isDarkMode)\n\t{\n\t\tif (_useSystemTheme)\n\t\t{\n\t\t\t_isSettingSystemTheme = true;\n\t\t\tTheme = isDarkMode ? Theme.Dark : Theme.Light;\n\t\t\t_isSettingSystemTheme = false;\n\t\t}\n\t\tAppearanceChanged?.Invoke(isDarkMode);\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Core/BindingExtensions.cs",
    "content": "using System.ComponentModel;\n\nnamespace Spice;\n\n/// <summary>\n/// Extension methods for data-binding support in Spice.\n/// Provides helpers to wire PropertyChanged subscriptions with minimal boilerplate.\n/// </summary>\npublic static class BindingExtensions\n{\n\t/// <summary>\n\t/// One-way binding: subscribes to source.PropertyChanged and invokes\n\t/// <paramref name=\"apply\"/> whenever the named property changes.\n\t/// Sets the initial value immediately.\n\t/// </summary>\n\t/// <typeparam name=\"TSource\">The type of the source object implementing INotifyPropertyChanged.</typeparam>\n\t/// <typeparam name=\"TValue\">The type of the property value.</typeparam>\n\t/// <param name=\"source\">The source object to bind to.</param>\n\t/// <param name=\"propertyName\">The name of the property to observe (use nameof() for compile-time safety).</param>\n\t/// <param name=\"getter\">Function to retrieve the property value from the source.</param>\n\t/// <param name=\"apply\">Action to execute when the property changes or on initial sync.</param>\n\t/// <returns>An IDisposable that can be used to unsubscribe from the PropertyChanged event.</returns>\n\t/// <example>\n\t/// <code>\n\t/// var vm = new MyViewModel();\n\t/// var label = new Label();\n\t/// vm.Bind(nameof(vm.Title), v => v.Title, text => label.Text = text);\n\t/// </code>\n\t/// </example>\n\tpublic static IDisposable Bind<TSource, TValue>(\n\t\tthis TSource source,\n\t\tstring propertyName,\n\t\tFunc<TSource, TValue> getter,\n\t\tAction<TValue> apply)\n\t\twhere TSource : INotifyPropertyChanged\n\t{\n\t\tArgumentNullException.ThrowIfNull(source);\n\t\tArgumentNullException.ThrowIfNull(propertyName);\n\t\tArgumentNullException.ThrowIfNull(getter);\n\t\tArgumentNullException.ThrowIfNull(apply);\n\n\t\t// Sync initial value\n\t\tapply(getter(source));\n\n\t\tPropertyChangedEventHandler handler = (_, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == propertyName)\n\t\t\t\tapply(getter(source));\n\t\t};\n\t\tsource.PropertyChanged += handler;\n\n\t\treturn new BindingSubscription(source, handler);\n\t}\n}\n\n/// <summary>\n/// Represents a subscription to a property binding that can be disposed to clean up the event handler.\n/// </summary>\ninternal sealed class BindingSubscription : IDisposable\n{\n\tprivate readonly INotifyPropertyChanged _source;\n\tprivate readonly PropertyChangedEventHandler _handler;\n\tprivate bool _disposed;\n\n\tpublic BindingSubscription(INotifyPropertyChanged source, PropertyChangedEventHandler handler)\n\t{\n\t\t_source = source;\n\t\t_handler = handler;\n\t}\n\n\tpublic void Dispose()\n\t{\n\t\tif (!_disposed)\n\t\t{\n\t\t\t_source.PropertyChanged -= _handler;\n\t\t\t_disposed = true;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Core/Border.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// Represents a border around a single child view. Set Content to a View, and customize with Stroke, StrokeThickness, CornerRadius, and Padding.\n/// Android -> FrameLayout with GradientDrawable background\n/// iOS -> UIView with CALayer border\n/// </summary>\npublic partial class Border : View\n{\n\t/// <summary>\n\t/// The single child view to display inside the border\n\t/// </summary>\n\t[ObservableProperty]\n\tView? _content;\n\n\t/// <summary>\n\t/// The color of the border stroke\n\t/// </summary>\n\t[ObservableProperty]\n\tColor? _stroke;\n\n\t/// <summary>\n\t/// The thickness of the border stroke in device-independent units\n\t/// </summary>\n\t[ObservableProperty]\n\tdouble _strokeThickness = 1.0;\n\n\t/// <summary>\n\t/// The corner radius of the border in device-independent units\n\t/// </summary>\n\t[ObservableProperty]\n\tdouble _cornerRadius;\n\n\t/// <summary>\n\t/// The padding between the border and its content in device-independent units (uniform padding on all sides)\n\t/// </summary>\n\t[ObservableProperty]\n\tdouble _padding;\n\n\t/// <inheritdoc />\n\tprotected override void ApplyTheme(Theme theme)\n\t{\n\t\tbase.ApplyTheme(theme);\n\t\tif (CanApplyTheme((int)ThemeProperty.Stroke))\n\t\t\tStroke = theme.StrokeColor;\n\t}\n\n\tpartial void OnStrokeChanging(Color? value) => TrackExplicit((int)ThemeProperty.Stroke, value);\n}\n"
  },
  {
    "path": "src/Spice/Core/BoxView.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// Represents a colored rectangle used for decoration, backgrounds, or dividing lines.\n/// Android -> Android.Views.View\n/// iOS -> UIKit.UIView\n/// </summary>\npublic partial class BoxView : View\n{\n\t/// <summary>\n\t/// Color of the box\n\t/// </summary>\n\t[ObservableProperty]\n\tColor? _color;\n}\n"
  },
  {
    "path": "src/Spice/Core/Button.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// You know the button! Use the Clicked event.\n/// Android -> Android.Widget.Button\n/// iOS -> UIKit.UIButton\n/// </summary>\npublic partial class Button : View\n{\n\t/// <summary>\n\t/// Text on the button\n\t/// </summary>\n\t[ObservableProperty]\n\tstring _text = \"\";\n\n\t/// <summary>\n\t/// Color of the text\n\t/// </summary>\n\t[ObservableProperty]\n\tColor? _textColor;\n\n\t/// <summary>\n\t/// Action to run when the button is tapped or clicked\n\t/// </summary>\n\t[ObservableProperty]\n\tAction<Button>? _clicked;\n\n\t/// <inheritdoc />\n\tprotected override void ApplyTheme(Theme theme)\n\t{\n\t\tbase.ApplyTheme(theme);\n\t\tif (CanApplyTheme((int)ThemeProperty.TextColor))\n\t\t\tTextColor = theme.TextColor;\n\t\tif (CanApplyTheme((int)ThemeProperty.BackgroundColor))\n\t\t\tBackgroundColor = theme.AccentColor;\n\t}\n\n\tpartial void OnTextColorChanging(Color? value) => TrackExplicit((int)ThemeProperty.TextColor, value);\n}"
  },
  {
    "path": "src/Spice/Core/CheckBox.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// A checkbox control for boolean selection.\n/// Android -> Android.Widget.CheckBox\n/// iOS -> UIKit.UIButton (with checkmark styling)\n/// </summary>\npublic partial class CheckBox : View\n{\n\t/// <summary>\n\t/// Whether the checkbox is checked\n\t/// </summary>\n\t[ObservableProperty]\n\tbool _isChecked;\n\n\t/// <summary>\n\t/// Action to run when the checkbox is checked or unchecked\n\t/// </summary>\n\t[ObservableProperty]\n\tAction<CheckBox>? _checkedChanged;\n}\n"
  },
  {
    "path": "src/Spice/Core/CollectionView.cs",
    "content": "using System.Collections;\n\nnamespace Spice;\n\n/// <summary>\n/// A view for presenting collections of data using a lambda-based item template.\n/// Android -> AndroidX.RecyclerView.Widget.RecyclerView\n/// iOS -> UIKit.UICollectionView\n/// </summary>\npublic partial class CollectionView : View, IDisposable\n{\n\t/// <summary>\n\t/// The collection of items to display. Can be any IEnumerable.\n\t/// </summary>\n\t[ObservableProperty]\n\tIEnumerable? _itemsSource;\n\n\t/// <summary>\n\t/// A lambda function that creates a View for each item in the ItemsSource.\n\t/// The function receives the item object and should return a View to display it.\n\t/// </summary>\n\t[ObservableProperty]\n\tFunc<object, View>? _itemTemplate;\n\n\t/// <summary>\n\t/// The orientation of the collection view. Defaults to Vertical.\n\t/// </summary>\n\t[ObservableProperty]\n\tOrientation _orientation;\n\n\t/// <summary>\n\t/// The selection mode for the collection view. Defaults to None.\n\t/// </summary>\n\t[ObservableProperty]\n\tSelectionMode _selectionMode;\n\n\t/// <summary>\n\t/// The currently selected item. Only valid when SelectionMode is Single.\n\t/// </summary>\n\t[ObservableProperty]\n\tobject? _selectedItem;\n\n\t/// <summary>\n\t/// The spacing between items in the collection view.\n\t/// </summary>\n\t[ObservableProperty]\n\tdouble _itemSpacing = 0;\n\n\t/// <summary>\n\t/// Tracks views created by the item template for disposal.\n\t/// </summary>\n\tinternal readonly List<View> _activeItemViews = [];\n\n\t/// <summary>\n\t/// Creates a view for an item using the ItemTemplate and tracks it for disposal.\n\t/// Platform implementations should call this instead of ItemTemplate directly.\n\t/// </summary>\n\tinternal View CreateItemView(object item)\n\t{\n\t\tif (ItemTemplate is null)\n\t\t\tthrow new InvalidOperationException(\"ItemTemplate is not set.\");\n\n\t\tvar view = ItemTemplate(item);\n\t\t_activeItemViews.Add(view);\n\t\treturn view;\n\t}\n\n\t/// <inheritdoc />\n\tpublic void Dispose()\n\t{\n\t\tforeach (var view in _activeItemViews)\n\t\t{\n\t\t\tDisposeRecursive(view);\n\t\t}\n\t\t_activeItemViews.Clear();\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Core/ColumnDefinition.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// Defines column-specific properties that apply to Grid elements.\n/// </summary>\npublic partial class ColumnDefinition : ObservableObject\n{\n\t/// <summary>\n\t/// Gets or sets the width of a ColumnDefinition.\n\t/// </summary>\n\t[ObservableProperty]\n\tGridLength _width = GridLength.Star;\n\n\t/// <summary>\n\t/// Initializes a new instance of ColumnDefinition with a Star width.\n\t/// </summary>\n\tpublic ColumnDefinition()\n\t{\n\t}\n\n\t/// <summary>\n\t/// Initializes a new instance of ColumnDefinition with the specified width.\n\t/// </summary>\n\tpublic ColumnDefinition(GridLength width)\n\t{\n\t\tWidth = width;\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Core/ContentView.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// A container view that holds a single child view via the Content property.\n/// Used for creating reusable custom controls and encapsulating UI components.\n/// Android -> Android.Views.ViewGroup (FrameLayout)\n/// iOS -> UIKit.UIView\n/// </summary>\npublic partial class ContentView : View\n{\n\tView? _content;\n\n\t/// <summary>\n\t/// Gets or sets the content (child view) of this ContentView.\n\t/// </summary>\n\tpublic View? Content\n\t{\n\t\tget => _content;\n\t\tset\n\t\t{\n\t\t\tvar oldContent = _content;\n\n\t\t\tif (SetProperty(ref _content, value))\n\t\t\t{\n\t\t\t\tOnContentChanged(oldContent, value);\n\t\t\t}\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Gets or sets the padding inside the ContentView in device-independent units (uniform padding on all sides).\n\t/// Platform implementations: Android.Views.ViewGroup.SetPadding / UIKit.UIView frame adjustments\n\t/// </summary>\n\t[ObservableProperty]\n\tdouble _padding;\n\n\tpartial void OnContentChanged(View? oldContent, View? newContent);\n}\n"
  },
  {
    "path": "src/Spice/Core/DatePicker.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// Control for date selection.\n/// Android -> Android.App.DatePickerDialog\n/// iOS -> UIKit.UIDatePicker\n/// </summary>\npublic partial class DatePicker : View\n{\n\t/// <summary>\n\t/// The selected date\n\t/// </summary>\n\t[ObservableProperty]\n\tDateTime _date = DateTime.Today;\n\n\t/// <summary>\n\t/// The minimum selectable date\n\t/// </summary>\n\t[ObservableProperty]\n\tDateTime? _minimumDate;\n\n\t/// <summary>\n\t/// The maximum selectable date\n\t/// </summary>\n\t[ObservableProperty]\n\tDateTime? _maximumDate;\n\n\t/// <summary>\n\t/// Color of the text\n\t/// </summary>\n\t[ObservableProperty]\n\tColor? _textColor;\n\n\t/// <inheritdoc />\n\tprotected override void ApplyTheme(Theme theme)\n\t{\n\t\tbase.ApplyTheme(theme);\n\t\tif (CanApplyTheme((int)ThemeProperty.TextColor))\n\t\t\tTextColor = theme.TextColor;\n\t}\n\n\tpartial void OnTextColorChanging(Color? value) => TrackExplicit((int)ThemeProperty.TextColor, value);\n}\n"
  },
  {
    "path": "src/Spice/Core/Editor.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// Control for multi-line text input.\n/// Android -> Android.Widget.EditText (multiline)\n/// iOS -> UIKit.UITextView\n/// </summary>\npublic partial class Editor : View\n{\n\t/// <summary>\n\t/// The text input by the user (also displayed)\n\t/// </summary>\n\t[ObservableProperty]\n\tstring _text = \"\";\n\n\t/// <summary>\n\t/// Color of the text\n\t/// </summary>\n\t[ObservableProperty]\n\tColor? _textColor;\n\n\t/// <summary>\n\t/// Placeholder text displayed when the editor is empty.\n\t/// Android only; iOS UITextView does not natively support placeholders.\n\t/// </summary>\n\t[ObservableProperty]\n\tstring? _placeholder;\n\n\t/// <summary>\n\t/// Color of the placeholder text.\n\t/// Android only; iOS UITextView does not natively support placeholders.\n\t/// </summary>\n\t[ObservableProperty]\n\tColor? _placeholderColor;\n\n\t/// <summary>\n\t/// Whether the editor automatically expands to fit content.\n\t/// Currently a stub on both platforms.\n\t/// </summary>\n\t[ObservableProperty]\n\tbool _autoSize = false;\n\n\t/// <inheritdoc />\n\tprotected override void ApplyTheme(Theme theme)\n\t{\n\t\tbase.ApplyTheme(theme);\n\t\tif (CanApplyTheme((int)ThemeProperty.TextColor))\n\t\t\tTextColor = theme.TextColor;\n\t\tif (CanApplyTheme((int)ThemeProperty.PlaceholderColor))\n\t\t\tPlaceholderColor = theme.PlaceholderColor;\n\t}\n\n\tpartial void OnTextColorChanging(Color? value) => TrackExplicit((int)ThemeProperty.TextColor, value);\n\n\tpartial void OnPlaceholderColorChanging(Color? value) => TrackExplicit((int)ThemeProperty.PlaceholderColor, value);\n}\n"
  },
  {
    "path": "src/Spice/Core/Entry.cs",
    "content": "﻿namespace Spice;\n\n/// <summary>\n/// Control for text input, like a form field.\n/// Android -> Android.Widget.EditText\n/// iOS -> UIKit.UITextField\n/// </summary>\npublic partial class Entry : View\n{\n\t/// <summary>\n\t/// The text input by the user (also displayed)\n\t/// </summary>\n\t[ObservableProperty]\n\tstring _text = \"\";\n\n\t/// <summary>\n\t/// Color of the text\n\t/// </summary>\n\t[ObservableProperty]\n\tColor? _textColor;\n\n\t/// <summary>\n\t/// Set to true to toggle password box\n\t/// </summary>\n\t[ObservableProperty]\n\tbool _isPassword = false;\n\n\t/// <inheritdoc />\n\tprotected override void ApplyTheme(Theme theme)\n\t{\n\t\tbase.ApplyTheme(theme);\n\t\tif (CanApplyTheme((int)ThemeProperty.TextColor))\n\t\t\tTextColor = theme.TextColor;\n\t}\n\n\tpartial void OnTextColorChanging(Color? value) => TrackExplicit((int)ThemeProperty.TextColor, value);\n}\n\n"
  },
  {
    "path": "src/Spice/Core/Grid.cs",
    "content": "using System.Collections.ObjectModel;\n\nnamespace Spice;\n\n/// <summary>\n/// A layout container that arranges child views in rows and columns.\n/// Android -> Android.Widget.GridLayout\n/// iOS -> Custom constraint-based layout\n/// \n/// Note: Auto-sized rows and columns are not fully supported and will behave as star-sized with weight 1.\n/// </summary>\npublic partial class Grid : View\n{\n\t/// <summary>\n\t/// Gets or sets the row definitions collection.\n\t/// </summary>\n\tpublic ObservableCollection<RowDefinition> RowDefinitions { get; } = new();\n\n\t/// <summary>\n\t/// Gets or sets the column definitions collection.\n\t/// </summary>\n\tpublic ObservableCollection<ColumnDefinition> ColumnDefinitions { get; } = new();\n\n\t/// <summary>\n\t/// Gets or sets the spacing between rows.\n\t/// </summary>\n\t[ObservableProperty]\n\tdouble _rowSpacing = 0;\n\n\t/// <summary>\n\t/// Gets or sets the spacing between columns.\n\t/// </summary>\n\t[ObservableProperty]\n\tdouble _columnSpacing = 0;\n\n\t/// <summary>\n\t/// Gets or sets the padding inside the Grid in device-independent units (uniform padding on all sides).\n\t/// Platform implementations: Android.Views.ViewGroup.SetPadding / iOS manual layout adjustments\n\t/// </summary>\n\t[ObservableProperty]\n\tdouble _padding;\n\n\t// Attached properties for child views (thread-safe)\n\tstatic readonly System.Collections.Concurrent.ConcurrentDictionary<View, int> _rows = new();\n\tstatic readonly System.Collections.Concurrent.ConcurrentDictionary<View, int> _columns = new();\n\tstatic readonly System.Collections.Concurrent.ConcurrentDictionary<View, int> _rowSpans = new();\n\tstatic readonly System.Collections.Concurrent.ConcurrentDictionary<View, int> _columnSpans = new();\n\n\t/// <summary>\n\t/// Gets the row position of the specified view.\n\t/// </summary>\n\tpublic static int GetRow(View view) => _rows.TryGetValue(view, out var row) ? row : 0;\n\n\t/// <summary>\n\t/// Sets the row position of the specified view.\n\t/// </summary>\n\tpublic static void SetRow(View view, int row)\n\t{\n\t\tif (row < 0)\n\t\t\tthrow new ArgumentOutOfRangeException(nameof(row), \"Row must be non-negative\");\n\t\t_rows[view] = row;\n\t}\n\n\t/// <summary>\n\t/// Gets the column position of the specified view.\n\t/// </summary>\n\tpublic static int GetColumn(View view) => _columns.TryGetValue(view, out var column) ? column : 0;\n\n\t/// <summary>\n\t/// Sets the column position of the specified view.\n\t/// </summary>\n\tpublic static void SetColumn(View view, int column)\n\t{\n\t\tif (column < 0)\n\t\t\tthrow new ArgumentOutOfRangeException(nameof(column), \"Column must be non-negative\");\n\t\t_columns[view] = column;\n\t}\n\n\t/// <summary>\n\t/// Gets the row span of the specified view.\n\t/// </summary>\n\tpublic static int GetRowSpan(View view) => _rowSpans.TryGetValue(view, out var span) ? span : 1;\n\n\t/// <summary>\n\t/// Sets the row span of the specified view.\n\t/// </summary>\n\tpublic static void SetRowSpan(View view, int span)\n\t{\n\t\tif (span < 1)\n\t\t\tthrow new ArgumentOutOfRangeException(nameof(span), \"RowSpan must be at least 1\");\n\t\t_rowSpans[view] = span;\n\t}\n\n\t/// <summary>\n\t/// Gets the column span of the specified view.\n\t/// </summary>\n\tpublic static int GetColumnSpan(View view) => _columnSpans.TryGetValue(view, out var span) ? span : 1;\n\n\t/// <summary>\n\t/// Sets the column span of the specified view.\n\t/// </summary>\n\tpublic static void SetColumnSpan(View view, int span)\n\t{\n\t\tif (span < 1)\n\t\t\tthrow new ArgumentOutOfRangeException(nameof(span), \"ColumnSpan must be at least 1\");\n\t\t_columnSpans[view] = span;\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Core/GridLength.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// Represents the length of elements that support GridUnitType-based units (like rows and columns in a Grid).\n/// </summary>\npublic struct GridLength : IEquatable<GridLength>\n{\n\t/// <summary>\n\t/// Initializes a new instance of GridLength using the specified absolute value in pixels.\n\t/// </summary>\n\tpublic GridLength(double value) : this(value, GridUnitType.Absolute)\n\t{\n\t}\n\n\t/// <summary>\n\t/// Initializes a new instance of GridLength using the specified absolute value and unit type.\n\t/// </summary>\n\tpublic GridLength(double value, GridUnitType type)\n\t{\n\t\tif (value < 0 || double.IsNaN(value) || double.IsInfinity(value))\n\t\t\tthrow new ArgumentException(\"Invalid value\", nameof(value));\n\n\t\tif (type == GridUnitType.Auto)\n\t\t\tvalue = 0;\n\n\t\tValue = value;\n\t\tGridUnitType = type;\n\t}\n\n\t/// <summary>\n\t/// Gets a GridLength value that is set to hold a value whose size is determined by the size properties of the content object.\n\t/// </summary>\n\tpublic static GridLength Auto { get; } = new GridLength(0, GridUnitType.Auto);\n\n\t/// <summary>\n\t/// Gets a GridLength value that represents the default size.\n\t/// </summary>\n\tpublic static GridLength Star { get; } = new GridLength(1, GridUnitType.Star);\n\n\t/// <summary>\n\t/// Gets the GridUnitType of the GridLength.\n\t/// </summary>\n\tpublic GridUnitType GridUnitType { get; }\n\n\t/// <summary>\n\t/// Gets a value that indicates whether the GridLength has a GridUnitType of Auto.\n\t/// </summary>\n\tpublic bool IsAuto => GridUnitType == GridUnitType.Auto;\n\n\t/// <summary>\n\t/// Gets a value that indicates whether the GridLength has a GridUnitType of Absolute.\n\t/// </summary>\n\tpublic bool IsAbsolute => GridUnitType == GridUnitType.Absolute;\n\n\t/// <summary>\n\t/// Gets a value that indicates whether the GridLength has a GridUnitType of Star.\n\t/// </summary>\n\tpublic bool IsStar => GridUnitType == GridUnitType.Star;\n\n\t/// <summary>\n\t/// Gets the value associated with the GridLength.\n\t/// </summary>\n\tpublic double Value { get; }\n\n\t/// <summary>\n\t/// Determines whether the specified GridLength is equal to the current GridLength.\n\t/// </summary>\n\tpublic bool Equals(GridLength other) =>\n\t\tGridUnitType == other.GridUnitType && Math.Abs(Value - other.Value) < double.Epsilon;\n\n\t/// <inheritdoc/>\n\tpublic override bool Equals(object? obj) => obj is GridLength other && Equals(other);\n\n\t/// <inheritdoc/>\n\tpublic override int GetHashCode() => HashCode.Combine(GridUnitType, Value);\n\n\t/// <summary>\n\t/// Compares two GridLength structures for equality.\n\t/// </summary>\n\tpublic static bool operator ==(GridLength left, GridLength right) => left.Equals(right);\n\n\t/// <summary>\n\t/// Compares two GridLength structures for inequality.\n\t/// </summary>\n\tpublic static bool operator !=(GridLength left, GridLength right) => !left.Equals(right);\n\n\t/// <inheritdoc/>\n\tpublic override string ToString()\n\t{\n\t\treturn GridUnitType switch\n\t\t{\n\t\t\tGridUnitType.Auto => \"Auto\",\n\t\t\tGridUnitType.Star => Value == 1 ? \"*\" : $\"{Value}*\",\n\t\t\tGridUnitType.Absolute => Value.ToString(),\n\t\t\t_ => Value.ToString()\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Core/GridUnitType.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// Describes the kind of value that a GridLength object is holding.\n/// </summary>\npublic enum GridUnitType\n{\n\t/// <summary>\n\t/// The size is determined by the size properties of the content object.\n\t/// </summary>\n\tAuto = 0,\n\t/// <summary>\n\t/// The value is expressed as a pixel.\n\t/// </summary>\n\tAbsolute = 1,\n\t/// <summary>\n\t/// The value is expressed as a weighted proportion of available space.\n\t/// </summary>\n\tStar = 2\n}\n"
  },
  {
    "path": "src/Spice/Core/Image.cs",
    "content": "﻿namespace Spice;\n\n/// <summary>\n/// Represents an image on screen. Set the Source property such as \"spice\".\n/// Android -> Android.Widget.ImageView\n/// iOS -> UIKit.UIImageView\n/// </summary>\npublic partial class Image : View\n{\n\t/// <summary>\n\t/// Source is a string name of an image without the extension. For \"spice.svg\", just pass \"spice\".\n\t/// Currently URLs and absolute file paths are not supported.\n\t/// </summary>\n\t[ObservableProperty]\n\tstring _source = \"\";\n}"
  },
  {
    "path": "src/Spice/Core/ImageButton.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// A button that displays an image instead of text. Use the Clicked event.\n/// Android -> Android.Widget.ImageButton\n/// iOS -> UIKit.UIButton\n/// </summary>\npublic partial class ImageButton : View\n{\n\t/// <summary>\n\t/// Source is a string name of an image without the extension. For \"spice.png\", just pass \"spice\".\n\t/// Currently URLs and absolute file paths are not supported.\n\t/// </summary>\n\t[ObservableProperty]\n\tstring _source = \"\";\n\n\t/// <summary>\n\t/// Action to run when the button is tapped or clicked\n\t/// </summary>\n\t[ObservableProperty]\n\tAction<ImageButton>? _clicked;\n}\n"
  },
  {
    "path": "src/Spice/Core/Label.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// Represents text on screen. Set the Text property to a string value.\n/// Android -> Android.Widget.TextView\n/// iOS -> UIKit.UILabel\n/// </summary>\npublic partial class Label : View\n{\n\t/// <summary>\n\t/// The text to display\n\t/// </summary>\n\t[ObservableProperty]\n\tstring _text = \"\";\n\n\t/// <summary>\n\t/// Color of the text\n\t/// </summary>\n\t[ObservableProperty]\n\tColor? _textColor;\n\n\t/// <inheritdoc />\n\tprotected override void ApplyTheme(Theme theme)\n\t{\n\t\tbase.ApplyTheme(theme);\n\t\tif (CanApplyTheme((int)ThemeProperty.TextColor))\n\t\t\tTextColor = theme.TextColor;\n\t}\n\n\tpartial void OnTextColorChanging(Color? value) => TrackExplicit((int)ThemeProperty.TextColor, value);\n}"
  },
  {
    "path": "src/Spice/Core/LayoutAlignment.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// Values that represent layout alignment.\n/// Maps to UIKit/Android alignment options.\n/// </summary>\npublic enum LayoutAlignment\n{\n\t/// <summary>\n\t/// The start of an alignment. Usually the Top or Left.\n\t/// Maps to: <c>Android.Widget.RelativeLayout.AlignParentLeft</c> / <c>Android.Widget.RelativeLayout.AlignParentTop</c> / UIKit frame positioning\n\t/// </summary>\n\tStart = 0,\n\t/// <summary>\n\t/// The center of an alignment.\n\t/// Maps to: <c>Android.Widget.RelativeLayout.CenterHorizontal</c> / <c>Android.Widget.RelativeLayout.CenterVertical</c> / UIKit frame positioning\n\t/// </summary>\n\tCenter = 1,\n\t/// <summary>\n\t/// The end of an alignment. Usually the Bottom or Right.\n\t/// Maps to: <c>Android.Widget.RelativeLayout.AlignParentRight</c> / <c>Android.Widget.RelativeLayout.AlignParentBottom</c> / UIKit frame positioning\n\t/// </summary>\n\tEnd = 2,\n\t/// <summary>\n\t/// Fill the entire area if possible.\n\t/// Maps to: <c>Android.Views.ViewGroup.LayoutParams.MatchParent</c> / UIKit full frame size\n\t/// </summary>\n\tFill = 3\n}\n"
  },
  {
    "path": "src/Spice/Core/LayoutExpandFlag.cs",
    "content": "namespace Spice;\n\n[Flags]\ninternal enum LayoutExpandFlag\n{\n\tExpand = 4\n}\n"
  },
  {
    "path": "src/Spice/Core/LayoutOptions.cs",
    "content": "using System;\n\nnamespace Spice;\n\n/// <summary>\n/// A struct whose static members define various alignment and expansion options.\n/// Compatible with .NET MAUI LayoutOptions.\n/// </summary>\npublic struct LayoutOptions : IEquatable<LayoutOptions>\n{\n\tint _flags;\n\n\t/// <summary>A <see cref=\"LayoutOptions\"/> structure that describes an element that appears at the start of its parent and does not expand.</summary>\n\tpublic static readonly LayoutOptions Start = new LayoutOptions(LayoutAlignment.Start, false);\n\t/// <summary>A <see cref=\"LayoutOptions\"/> structure that describes an element that is centered and does not expand.</summary>\n\tpublic static readonly LayoutOptions Center = new LayoutOptions(LayoutAlignment.Center, false);\n\t/// <summary>A <see cref=\"LayoutOptions\"/> structure that describes an element that appears at the end of its parent and does not expand.</summary>\n\tpublic static readonly LayoutOptions End = new LayoutOptions(LayoutAlignment.End, false);\n\t/// <summary>A <see cref=\"LayoutOptions\"/> structure that describes an element that has no padding around itself and does not expand.</summary>\n\tpublic static readonly LayoutOptions Fill = new LayoutOptions(LayoutAlignment.Fill, false);\n\n\t/// <summary>A <see cref=\"LayoutOptions\"/> structure that describes an element that appears at the start of its parent and expands.</summary>\n\t[Obsolete(\"The StackLayout expansion options are deprecated; please use a Grid instead.\")]\n\tpublic static readonly LayoutOptions StartAndExpand = new LayoutOptions(LayoutAlignment.Start, true);\n\n\t/// <summary>A <see cref=\"LayoutOptions\"/> structure that describes an element that is centered and expands.</summary>\n\t[Obsolete(\"The StackLayout expansion options are deprecated; please use a Grid instead.\")]\n\tpublic static readonly LayoutOptions CenterAndExpand = new LayoutOptions(LayoutAlignment.Center, true);\n\n\t/// <summary>A <see cref=\"LayoutOptions\"/> object that describes an element that appears at the end of its parent and expands.</summary>\n\t[Obsolete(\"The StackLayout expansion options are deprecated; please use a Grid instead.\")]\n\tpublic static readonly LayoutOptions EndAndExpand = new LayoutOptions(LayoutAlignment.End, true);\n\n\t/// <summary>A <see cref=\"LayoutOptions\"/> structure that describes an element that has no padding around itself and expands.</summary>\n\t[Obsolete(\"The StackLayout expansion options are deprecated; please use a Grid instead.\")]\n\tpublic static readonly LayoutOptions FillAndExpand = new LayoutOptions(LayoutAlignment.Fill, true);\n\n\t/// <summary>Creates a new <see cref=\"LayoutOptions\"/> object with <paramref name=\"alignment\"/> and <paramref name=\"expands\"/>.</summary>\n\t/// <param name=\"alignment\">An alignment value.</param>\n\t/// <param name=\"expands\">Whether or not an element will expand to fill available space in its parent.</param>\n\tpublic LayoutOptions(LayoutAlignment alignment, bool expands)\n\t{\n\t\tvar a = (int)alignment;\n\t\tif (a < 0 || a > 3)\n\t\t\tthrow new ArgumentOutOfRangeException(nameof(alignment));\n\t\t_flags = (int)alignment | (expands ? (int)LayoutExpandFlag.Expand : 0);\n\t}\n\n\t/// <summary>Gets or sets a value that indicates how an element will be aligned.</summary>\n\tpublic LayoutAlignment Alignment\n\t{\n\t\tget { return (LayoutAlignment)(_flags & 3); }\n\t\tset { _flags = (_flags & ~3) | (int)value; }\n\t}\n\n\t/// <summary>Gets or sets a value that indicates whether or not the element that is described by this <see cref=\"LayoutOptions\"/> structure will occupy the largest space that its parent will give to it.</summary>\n\tpublic bool Expands\n\t{\n\t\tget { return (_flags & (int)LayoutExpandFlag.Expand) != 0; }\n\t\tset { _flags = (_flags & 3) | (value ? (int)LayoutExpandFlag.Expand : 0); }\n\t}\n\n\t/// <inheritdoc/>\n\tpublic bool Equals(LayoutOptions other) => _flags == other._flags;\n\n\t/// <inheritdoc/>\n\tpublic override bool Equals(object? obj) => obj is LayoutOptions other && Equals(other);\n\n\t/// <inheritdoc/>\n\tpublic override int GetHashCode() => _flags.GetHashCode();\n\n\t/// <summary>Determines whether two <see cref=\"LayoutOptions\"/> structures are equal.</summary>\n\tpublic static bool operator ==(LayoutOptions left, LayoutOptions right) => left.Equals(right);\n\n\t/// <summary>Determines whether two <see cref=\"LayoutOptions\"/> structures are not equal.</summary>\n\tpublic static bool operator !=(LayoutOptions left, LayoutOptions right) => !(left == right);\n}\n"
  },
  {
    "path": "src/Spice/Core/NavigationView.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// A view that provides push/pop navigation with a navigation bar.\n/// Platform implementations: iOS UINavigationController / Android Toolbar with FrameLayout\n/// </summary>\npublic partial class NavigationView : View\n{\n#if VANILLA\n\t/// <summary>\n\t/// Creates a NavigationView.\n\t/// </summary>\n\tpublic NavigationView() { }\n#endif\n\n\t/// <summary>\n\t/// Creates a NavigationView with the specified root view.\n\t/// </summary>\n\t/// <param name=\"root\">The root view to display in the navigation stack.</param>\n\tpublic NavigationView(View root) : this()\n\t{\n\t\tArgumentNullException.ThrowIfNull(root);\n\t\tPush(root);\n\t}\n\n\t/// <summary>\n\t/// Creates a NavigationView with a factory function for the root view.\n\t/// The root view is created lazily when needed.\n\t/// </summary>\n\t/// <param name=\"factory\">A function that creates the root view.</param>\n\tpublic NavigationView(Func<View> factory) : this()\n\t{\n\t\tArgumentNullException.ThrowIfNull(factory);\n\t\tPush(factory);\n\t}\n\n\t/// <summary>\n\t/// Pushes a view onto the navigation stack.\n\t/// </summary>\n\t/// <param name=\"view\">The view to push.</param>\n\tpublic void Push(View view)\n\t{\n\t\tArgumentNullException.ThrowIfNull(view);\n\t\tview.Navigation = this;\n\t\tPushCore(view);\n\t}\n\n\t/// <summary>\n\t/// Pushes a view created by a factory function onto the navigation stack.\n\t/// The view is created immediately when this method is called.\n\t/// </summary>\n\t/// <param name=\"factory\">A function that creates the view to push.</param>\n\tpublic void Push(Func<View> factory)\n\t{\n\t\tArgumentNullException.ThrowIfNull(factory);\n\t\tvar view = factory();\n\t\tPush(view);\n\t}\n\n\t/// <summary>\n\t/// Pushes a view of type T onto the navigation stack.\n\t/// The view is created lazily using its parameterless constructor.\n\t/// </summary>\n\t/// <typeparam name=\"T\">The type of view to push. Must have a parameterless constructor.</typeparam>\n\tpublic void Push<T>() where T : View, new()\n\t{\n\t\tPush(new T());\n\t}\n\n\t/// <summary>\n\t/// Pops the top view from the navigation stack.\n\t/// </summary>\n\tpublic void Pop()\n\t{\n\t\tPopCore();\n\t}\n\n\t/// <summary>\n\t/// Pops all views except the root view from the navigation stack.\n\t/// </summary>\n\tpublic void PopToRoot()\n\t{\n\t\tPopToRootCore();\n\t}\n\n\t/// <summary>\n\t/// Platform-specific implementation of Push.\n\t/// </summary>\n\tpartial void PushCore(View view);\n\n\t/// <summary>\n\t/// Platform-specific implementation of Pop.\n\t/// </summary>\n\tpartial void PopCore();\n\n\t/// <summary>\n\t/// Platform-specific implementation of PopToRoot.\n\t/// </summary>\n\tpartial void PopToRootCore();\n}\n\n/// <summary>\n/// A NavigationView that creates its root view lazily using a parameterless constructor.\n/// </summary>\n/// <typeparam name=\"TRoot\">The type of the root view. Must have a parameterless constructor.</typeparam>\npublic partial class NavigationView<TRoot> : NavigationView where TRoot : View, new()\n{\n\t/// <summary>\n\t/// Creates a NavigationView that will lazily create a root view of type TRoot.\n\t/// </summary>\n\tpublic NavigationView() : base(() => new TRoot())\n\t{\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Core/Orientation.cs",
    "content": "﻿namespace Spice;\n\n/// <summary>\n/// General Orientation enum.\n/// Currently only used by StackLayout.\n/// </summary>\npublic enum Orientation\n{\n\t/// <summary>\n\t/// Orient vertically\n\t/// </summary>\n\tVertical,\n\t/// <summary>\n\t/// Orient horizontally\n\t/// </summary>\n\tHorizontal,\n}"
  },
  {
    "path": "src/Spice/Core/Picker.cs",
    "content": "using System.Collections.ObjectModel;\n\nnamespace Spice;\n\n/// <summary>\n/// Picker control for selecting an item from a list.\n/// Android -> Android.Widget.Spinner\n/// iOS -> UIKit.UIPickerView\n/// </summary>\npublic partial class Picker : View\n{\n\t/// <summary>\n\t/// The collection of items to display in the picker\n\t/// </summary>\n\t[ObservableProperty]\n\tObservableCollection<string> _items = new();\n\n\t/// <summary>\n\t/// The index of the currently selected item, or -1 if no item is selected\n\t/// </summary>\n\t[ObservableProperty]\n\tint _selectedIndex = -1;\n\n\t/// <summary>\n\t/// The currently selected item, or null if no item is selected\n\t/// </summary>\n\tpublic string? SelectedItem => _selectedIndex >= 0 && _selectedIndex < Items.Count ? Items[_selectedIndex] : null;\n\n\tpartial void OnSelectedIndexChanged(int oldValue, int newValue)\n\t{\n\t\tOnPropertyChanged(nameof(SelectedItem));\n\t}\n\n\tpartial void OnItemsChanged(ObservableCollection<string> value)\n\t{\n\t\tOnPropertyChanged(nameof(SelectedItem));\n\t}\n\n\t/// <summary>\n\t/// Optional title text to display for the picker\n\t/// </summary>\n\t[ObservableProperty]\n\tstring _title = \"\";\n\n\t/// <summary>\n\t/// Color of the text\n\t/// </summary>\n\t[ObservableProperty]\n\tColor? _textColor;\n\n\t/// <inheritdoc />\n\tprotected override void ApplyTheme(Theme theme)\n\t{\n\t\tbase.ApplyTheme(theme);\n\t\tif (CanApplyTheme((int)ThemeProperty.TextColor))\n\t\t\tTextColor = theme.TextColor;\n\t}\n\n\tpartial void OnTextColorChanging(Color? value) => TrackExplicit((int)ThemeProperty.TextColor, value);\n}\n"
  },
  {
    "path": "src/Spice/Core/PlatformAppearance.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// Provides cross-platform access to the system's appearance (light/dark mode).\n/// Platform implementations provide the actual detection logic.\n/// </summary>\npublic static partial class PlatformAppearance\n{\n\t/// <summary>\n\t/// Event raised when the system appearance changes.\n\t/// The bool parameter is true when the system switched to dark mode.\n\t/// </summary>\n\tpublic static event Action<bool>? Changed;\n\n\tinternal static void OnChanged(bool isDarkMode) => Changed?.Invoke(isDarkMode);\n\n#if VANILLA\n\t/// <summary>\n\t/// Gets whether the system is in dark mode. Always false on net10.0 (no device).\n\t/// </summary>\n\tpublic static bool IsDarkMode => false;\n#endif\n}\n"
  },
  {
    "path": "src/Spice/Core/ProgressBar.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// Displays a progress indicator showing the completion percentage of a task.\n/// Android -> Android.Widget.ProgressBar\n/// iOS -> UIKit.UIProgressView\n/// </summary>\npublic partial class ProgressBar : View\n{\n\tdouble _progress;\n\n\t/// <summary>\n\t/// The progress value, ranging from 0.0 (0%) to 1.0 (100%).\n\t/// Values outside this range will be clamped.\n\t/// </summary>\n\tpublic double Progress\n\t{\n\t\tget => _progress;\n\t\tset\n\t\t{\n\t\t\tvar clampedValue = Math.Clamp(value, 0.0, 1.0);\n\t\t\tif (SetProperty(ref _progress, clampedValue))\n\t\t\t{\n\t\t\t\tOnProgressChanged(clampedValue);\n\t\t\t}\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Called when the Progress property changes\n\t/// </summary>\n\tpartial void OnProgressChanged(double value);\n}\n"
  },
  {
    "path": "src/Spice/Core/RadioButton.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// A radio button control for single selection from a group of options.\n/// Android -> Android.Widget.RadioButton\n/// iOS -> UIKit.UIButton (with circle styling)\n///\n/// Group exclusivity is managed in shared code via <see cref=\"GroupName\"/> rather than\n/// Android's RadioGroup, because iOS has no native radio button or group concept.\n/// A cross-platform dictionary keeps behavior consistent on both platforms.\n/// </summary>\npublic partial class RadioButton : View\n{\n\tstatic readonly Dictionary<string, List<WeakReference<RadioButton>>> _groups = new();\n\n\t/// <summary>\n\t/// Whether the radio button is checked\n\t/// </summary>\n\t[ObservableProperty]\n\tbool _isChecked;\n\n\t/// <summary>\n\t/// The group name for mutually exclusive selection\n\t/// </summary>\n\t[ObservableProperty]\n\tstring? _groupName;\n\n\t/// <summary>\n\t/// The text content to display next to the radio button\n\t/// </summary>\n\t[ObservableProperty]\n\tstring? _content;\n\n\t/// <summary>\n\t/// Action to run when the radio button is checked or unchecked\n\t/// </summary>\n\t[ObservableProperty]\n\tAction<RadioButton>? _checkedChanged;\n\n\tpartial void OnIsCheckedChanged(bool value)\n\t{\n\t\tOnIsCheckedChangedPartial(value);\n\n\t\t// Handle group exclusivity\n\t\tif (value && !string.IsNullOrEmpty(GroupName))\n\t\t{\n\t\t\tUncheckOthersInGroup();\n\t\t}\n\t}\n\n\tpartial void OnGroupNameChanged(string? oldValue, string? newValue)\n\t{\n\t\t// Remove from old group\n\t\tif (!string.IsNullOrEmpty(oldValue))\n\t\t{\n\t\t\tlock (_groups)\n\t\t\t{\n\t\t\t\tif (_groups.TryGetValue(oldValue, out var oldGroupList))\n\t\t\t\t{\n\t\t\t\t\toldGroupList.RemoveAll(wr => !wr.TryGetTarget(out var rb) || rb == this);\n\t\t\t\t\t\n\t\t\t\t\t// Clean up empty groups\n\t\t\t\t\tif (oldGroupList.Count == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t_groups.Remove(oldValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Register in new group and handle exclusivity if already checked\n\t\tif (IsChecked && !string.IsNullOrEmpty(newValue))\n\t\t{\n\t\t\tUncheckOthersInGroup();\n\t\t}\n\t}\n\n\tvoid UncheckOthersInGroup()\n\t{\n\t\tif (string.IsNullOrEmpty(GroupName))\n\t\t\treturn;\n\n\t\tList<RadioButton> buttonsToNotify = new();\n\n\t\tlock (_groups)\n\t\t{\n\t\t\tif (_groups.TryGetValue(GroupName, out var groupList))\n\t\t\t{\n\t\t\t\t// Clean up dead references and collect buttons to uncheck\n\t\t\t\tgroupList.RemoveAll(wr => !wr.TryGetTarget(out _));\n\t\t\t\t\n\t\t\t\tforeach (var weakRef in groupList)\n\t\t\t\t{\n\t\t\t\t\tif (weakRef.TryGetTarget(out var radioButton) && radioButton != this && radioButton.IsChecked)\n\t\t\t\t\t{\n\t\t\t\t\t\tradioButton.IsChecked = false;\n\t\t\t\t\t\tbuttonsToNotify.Add(radioButton);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Create the group list\n\t\t\t\tgroupList = new List<WeakReference<RadioButton>>();\n\t\t\t\t_groups[GroupName] = groupList;\n\t\t\t}\n\n\t\t\t// Add this radio button to the group if not already present\n\t\t\tbool found = false;\n\t\t\tforeach (var weakRef in groupList)\n\t\t\t{\n\t\t\t\tif (weakRef.TryGetTarget(out var rb) && rb == this)\n\t\t\t\t{\n\t\t\t\t\tfound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (!found)\n\t\t\t{\n\t\t\t\tgroupList.Add(new WeakReference<RadioButton>(this));\n\t\t\t}\n\t\t}\n\n\t\t// Invoke callbacks outside the lock\n\t\tforeach (var button in buttonsToNotify)\n\t\t{\n\t\t\tbutton.CheckedChanged?.Invoke(button);\n\t\t}\n\t}\n\n\t// Platform-specific implementation\n\tpartial void OnIsCheckedChangedPartial(bool value);\n}\n"
  },
  {
    "path": "src/Spice/Core/RefreshView.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// A container view that provides pull-to-refresh functionality for scrollable content.\n/// Wrap a scrollable view (such as ScrollView, ListView, or CollectionView) to enable pull-to-refresh.\n/// Android -> AndroidX.SwipeRefreshLayout.Widget.SwipeRefreshLayout\n/// iOS -> UIKit.UIView with UIRefreshControl attached to child scroll view\n/// </summary>\npublic partial class RefreshView : View\n{\n\tView? _content;\n\n\t/// <summary>\n\t/// Gets or sets the content (child view) of this RefreshView.\n\t/// Should be a scrollable view like ScrollView for pull-to-refresh to work properly.\n\t/// </summary>\n\tpublic View? Content\n\t{\n\t\tget => _content;\n\t\tset\n\t\t{\n\t\t\tvar oldContent = _content;\n\n\t\t\tif (SetProperty(ref _content, value))\n\t\t\t{\n\t\t\t\tOnContentChanged(oldContent, value);\n\t\t\t}\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Gets or sets whether the view is currently refreshing.\n\t/// Set to true to show the refresh indicator; set to false to hide it.\n\t/// </summary>\n\t[ObservableProperty]\n\tbool _isRefreshing;\n\n\t/// <summary>\n\t/// Gets or sets the command to execute when a refresh is triggered.\n\t/// </summary>\n\t[ObservableProperty]\n\tAction? _command;\n\n\t/// <summary>\n\t/// Gets or sets the color of the refresh indicator.\n\t/// </summary>\n\t[ObservableProperty]\n\tColor? _refreshColor;\n\n\t/// <summary>\n\t/// Gets or sets the padding inside the RefreshView in device-independent units (uniform padding on all sides).\n\t/// Platform implementations: Android.Views.ViewGroup.SetPadding / UIKit.UIView frame adjustments\n\t/// </summary>\n\t[ObservableProperty]\n\tdouble _padding;\n\n\tpartial void OnContentChanged(View? oldContent, View? newContent);\n}\n"
  },
  {
    "path": "src/Spice/Core/RootComponent.cs",
    "content": "﻿// From: https://github.com/dotnet/maui/blob/c8a6093ee805388732af8d75b437b099a301db22/src/BlazorWebView/src/Maui/RootComponent.cs\n// Copyright (c) .NET Foundation. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\n\nusing Microsoft.AspNetCore.Components;\nusing Microsoft.AspNetCore.Components.WebView;\n\nnamespace Spice;\n\n/// <summary>\n/// Describes a root component that can be added to a <see cref=\"BlazorWebView\"/>.\n/// </summary>\npublic class RootComponent\n{\n\t/// <summary>\n\t/// Gets or sets the CSS selector string that specifies where in the document the component should be placed.\n\t/// This must be unique among the root components within the <see cref=\"BlazorWebView\"/>.\n\t/// </summary>\n\tpublic string? Selector { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the type of the root component. This type must implement <see cref=\"IComponent\"/>.\n\t/// </summary>\n\tpublic Type? ComponentType { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets an optional dictionary of parameters to pass to the root component.\n\t/// </summary>\n\tpublic IDictionary<string, object?>? Parameters { get; set; }\n\n\tinternal Task AddToWebViewManagerAsync(WebViewManager webViewManager)\n\t{\n\t\t// As a characteristic of XAML,we can't rely on non-default constructors. So we have to\n\t\t// validate that the required properties were set. We could skip validating this and allow\n\t\t// the lower-level renderer code to throw, but that would be harder for developers to understand.\n\n\t\tif (string.IsNullOrWhiteSpace(Selector))\n\t\t{\n\t\t\tthrow new InvalidOperationException($\"{nameof(RootComponent)} requires a value for its {nameof(Selector)} property, but no value was set.\");\n\t\t}\n\n\t\tif (ComponentType is null)\n\t\t{\n\t\t\tthrow new InvalidOperationException($\"{nameof(RootComponent)} requires a value for its {nameof(ComponentType)} property, but no value was set.\");\n\t\t}\n\n\t\tvar parameterView = Parameters == null ? ParameterView.Empty : ParameterView.FromDictionary(Parameters);\n\t\treturn webViewManager.AddRootComponentAsync(ComponentType, Selector, parameterView);\n\t}\n\n\tinternal Task RemoveFromWebViewManagerAsync(WebViewManager webviewManager)\n\t{\n\t\tif (string.IsNullOrWhiteSpace(Selector))\n\t\t{\n\t\t\tthrow new InvalidOperationException($\"{nameof(RootComponent)} requires a value for its {nameof(Selector)} property, but no value was set.\");\n\t\t}\n\t\treturn webviewManager.RemoveRootComponentAsync(Selector);\n\t}\n}"
  },
  {
    "path": "src/Spice/Core/RowDefinition.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// Defines row-specific properties that apply to Grid elements.\n/// </summary>\npublic partial class RowDefinition : ObservableObject\n{\n\t/// <summary>\n\t/// Gets or sets the height of a RowDefinition.\n\t/// </summary>\n\t[ObservableProperty]\n\tGridLength _height = GridLength.Star;\n\n\t/// <summary>\n\t/// Initializes a new instance of RowDefinition with a Star height.\n\t/// </summary>\n\tpublic RowDefinition()\n\t{\n\t}\n\n\t/// <summary>\n\t/// Initializes a new instance of RowDefinition with the specified height.\n\t/// </summary>\n\tpublic RowDefinition(GridLength height)\n\t{\n\t\tHeight = height;\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Core/ScrollView.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// A scrollable container view that can hold a single child view.\n/// Android -> Android.Widget.ScrollView (vertical) / Android.Widget.HorizontalScrollView (horizontal)\n/// iOS -> UIKit.UIScrollView\n/// </summary>\npublic partial class ScrollView : View\n{\n\t/// <summary>\n\t/// The orientation of the scroll view. Defaults to Vertical.\n\t/// </summary>\n\t[ObservableProperty]\n\tOrientation _orientation;\n\n\t/// <summary>\n\t/// Gets or sets the padding inside the ScrollView in device-independent units (uniform padding on all sides).\n\t/// Platform implementations: Android.Views.ViewGroup.SetPadding / UIKit.UIScrollView.ContentInset\n\t/// </summary>\n\t[ObservableProperty]\n\tdouble _padding;\n}\n"
  },
  {
    "path": "src/Spice/Core/SearchBar.cs",
    "content": "﻿namespace Spice;\n\n/// <summary>\n/// Control for search input with a search button.\n/// Android -> Android.Widget.SearchView\n/// iOS -> UIKit.UISearchBar\n/// </summary>\npublic partial class SearchBar : View\n{\n\t/// <summary>\n\t/// The search text input by the user\n\t/// </summary>\n\t[ObservableProperty]\n\tstring _text = \"\";\n\n\t/// <summary>\n\t/// Placeholder text displayed when the search bar is empty\n\t/// </summary>\n\t[ObservableProperty]\n\tstring? _placeholder;\n\n\t/// <summary>\n\t/// Color of the search text\n\t/// </summary>\n\t[ObservableProperty]\n\tColor? _textColor;\n\n\t/// <summary>\n\t/// Color of the placeholder text\n\t/// </summary>\n\t[ObservableProperty]\n\tColor? _placeholderColor;\n\n\t/// <summary>\n\t/// Action to run when the search button is pressed\n\t/// </summary>\n\t[ObservableProperty]\n\tAction<SearchBar>? _searchButtonPressed;\n\n\t/// <summary>\n\t/// Action to run when the text changes\n\t/// </summary>\n\t[ObservableProperty]\n\tAction<SearchBar>? _textChanged;\n\n\t/// <inheritdoc />\n\tprotected override void ApplyTheme(Theme theme)\n\t{\n\t\tbase.ApplyTheme(theme);\n\t\tif (CanApplyTheme((int)ThemeProperty.TextColor))\n\t\t\tTextColor = theme.TextColor;\n\t\tif (CanApplyTheme((int)ThemeProperty.PlaceholderColor))\n\t\t\tPlaceholderColor = theme.PlaceholderColor;\n\t}\n\n\tpartial void OnTextColorChanging(Color? value) => TrackExplicit((int)ThemeProperty.TextColor, value);\n\n\tpartial void OnPlaceholderColorChanging(Color? value) => TrackExplicit((int)ThemeProperty.PlaceholderColor, value);\n}\n"
  },
  {
    "path": "src/Spice/Core/SelectionMode.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// Defines the selection mode for a CollectionView.\n/// </summary>\npublic enum SelectionMode\n{\n\t/// <summary>\n\t/// No items can be selected\n\t/// </summary>\n\tNone,\n\t/// <summary>\n\t/// Only one item can be selected at a time\n\t/// </summary>\n\tSingle,\n\t/// <summary>\n\t/// Multiple items can be selected\n\t/// </summary>\n\tMultiple,\n}\n"
  },
  {
    "path": "src/Spice/Core/Slider.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// A slider control for selecting a numeric value from a range.\n/// Android -> Android.Widget.SeekBar\n/// iOS -> UIKit.UISlider\n/// </summary>\n/// <remarks>\n/// Note: Android SeekBar only supports integer values. While the API accepts doubles,\n/// values will be cast to integers on Android. For fractional ranges, use a larger\n/// integer range (e.g., 0-100 instead of 0.0-1.0) and scale in your code.\n/// </remarks>\npublic partial class Slider : View\n{\n\t/// <summary>\n\t/// The minimum value of the slider range\n\t/// </summary>\n\t[ObservableProperty]\n\tdouble _minimum = 0;\n\n\t/// <summary>\n\t/// The maximum value of the slider range\n\t/// </summary>\n\t[ObservableProperty]\n\tdouble _maximum = 1;\n\n\t/// <summary>\n\t/// The current value of the slider\n\t/// </summary>\n\t[ObservableProperty]\n\tdouble _value = 0;\n\n\t/// <summary>\n\t/// Action invoked when the slider value changes\n\t/// </summary>\n\t[ObservableProperty]\n\tAction<Slider>? _valueChanged;\n}\n"
  },
  {
    "path": "src/Spice/Core/StackLayout.cs",
    "content": "﻿namespace Spice;\n\n/// <summary>\n/// A parent view for laying out child controls in a row. Defaults to Orientation=Vertical.\n/// Android -> Android.Widget.LinearLayout\n/// iOS -> UIKit.UIStackView\n/// </summary>\npublic partial class StackLayout : View\n{\n\t/// <summary>\n\t/// Set to specify if layout is vertical or horizontal. Defaults to vertical.\n\t/// </summary>\n\t[ObservableProperty]\n\tOrientation _orientation;\n\n\t/// <summary>\n\t/// Spacing between children\n\t/// </summary>\n\t[ObservableProperty]\n\tdouble _spacing = 0;\n\n\t/// <summary>\n\t/// Gets or sets the padding inside the StackLayout in device-independent units (uniform padding on all sides).\n\t/// Platform implementations: Android.Views.ViewGroup.SetPadding / UIKit.UIStackView.LayoutMargins\n\t/// </summary>\n\t[ObservableProperty]\n\tdouble _padding;\n}"
  },
  {
    "path": "src/Spice/Core/SwipeBehaviorOnInvoked.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// Defines the behavior of a SwipeView after a swipe item is invoked.\n/// </summary>\npublic enum SwipeBehaviorOnInvoked\n{\n\t/// <summary>\n\t/// The SwipeView will automatically determine whether to close after invocation.\n\t/// </summary>\n\tAuto,\n\n\t/// <summary>\n\t/// The SwipeView will close after a swipe item is invoked.\n\t/// </summary>\n\tClose,\n\n\t/// <summary>\n\t/// The SwipeView will remain open after a swipe item is invoked.\n\t/// </summary>\n\tRemainOpen\n}\n"
  },
  {
    "path": "src/Spice/Core/SwipeDirection.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// Defines the direction of a swipe gesture.\n/// </summary>\npublic enum SwipeDirection\n{\n\t/// <summary>\n\t/// Swipe from right to left.\n\t/// </summary>\n\tLeft,\n\n\t/// <summary>\n\t/// Swipe from left to right.\n\t/// </summary>\n\tRight,\n\n\t/// <summary>\n\t/// Swipe from bottom to top.\n\t/// </summary>\n\tUp,\n\n\t/// <summary>\n\t/// Swipe from top to bottom.\n\t/// </summary>\n\tDown\n}\n"
  },
  {
    "path": "src/Spice/Core/SwipeItem.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// Represents an individual swipe action item that can be invoked.\n/// Each SwipeItem can display text and a background color.\n/// </summary>\npublic partial class SwipeItem : ObservableObject\n{\n\t/// <summary>\n\t/// Gets or sets the text displayed on the swipe item.\n\t/// </summary>\n\t[ObservableProperty]\n\tstring? _text;\n\n\t/// <summary>\n\t/// Gets or sets the background color of the swipe item.\n\t/// </summary>\n\t[ObservableProperty]\n\tColor? _backgroundColor;\n\n\t/// <summary>\n\t/// Gets or sets a value indicating whether this swipe item is visible.\n\t/// </summary>\n\t[ObservableProperty]\n\tbool _isVisible = true;\n\n\t/// <summary>\n\t/// Gets or sets the action to invoke when the swipe item is tapped or clicked.\n\t/// </summary>\n\t[ObservableProperty]\n\tAction<SwipeItem>? _invoked;\n}\n"
  },
  {
    "path": "src/Spice/Core/SwipeItems.cs",
    "content": "using System.Collections.ObjectModel;\n\nnamespace Spice;\n\n/// <summary>\n/// Represents a collection of SwipeItem objects for a specific swipe direction.\n/// Defines the behavior and appearance of swipe items revealed by a swipe gesture.\n/// </summary>\npublic partial class SwipeItems : ObservableObject\n{\n\t/// <summary>\n\t/// Gets or sets the swipe mode, which determines how swipe items behave.\n\t/// Note: Current platform implementations only support Reveal mode.\n\t/// </summary>\n\t[ObservableProperty]\n\tSwipeMode _mode = SwipeMode.Reveal;\n\n\t/// <summary>\n\t/// Gets or sets the behavior of the SwipeView after a swipe item is invoked.\n\t/// </summary>\n\t[ObservableProperty]\n\tSwipeBehaviorOnInvoked _swipeBehaviorOnInvoked = SwipeBehaviorOnInvoked.Auto;\n\n\t/// <summary>\n\t/// Gets the collection of SwipeItem objects.\n\t/// </summary>\n\tpublic ObservableCollection<SwipeItem> Items { get; } = new();\n\n\t/// <summary>\n\t/// Initializes a new instance of the SwipeItems class.\n\t/// </summary>\n\tpublic SwipeItems()\n\t{\n\t}\n\n\t/// <summary>\n\t/// Initializes a new instance of the SwipeItems class with the specified items.\n\t/// </summary>\n\t/// <param name=\"items\">The collection of SwipeItem objects to add.</param>\n\tpublic SwipeItems(IEnumerable<SwipeItem> items)\n\t{\n\t\tArgumentNullException.ThrowIfNull(items);\n\t\t\n\t\tforeach (var item in items)\n\t\t{\n\t\t\tItems.Add(item);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Core/SwipeMode.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// Defines the effect of a swipe interaction on SwipeItems.\n/// </summary>\npublic enum SwipeMode\n{\n\t/// <summary>\n\t/// Swipe items are revealed and remain visible until dismissed.\n\t/// </summary>\n\tReveal,\n\n\t/// <summary>\n\t/// Swipe items are executed immediately when the swipe gesture is detected.\n\t/// </summary>\n\tExecute\n}\n"
  },
  {
    "path": "src/Spice/Core/SwipeView.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// A container control that wraps around an item of content and provides context menu items \n/// that are revealed by a swipe gesture.\n/// Android -> Custom view with gesture detection\n/// iOS -> UIKit.UIView with gesture recognizers\n/// </summary>\npublic partial class SwipeView : View\n{\n\tView? _content;\n\n\t/// <summary>\n\t/// Gets or sets the content (child view) of this SwipeView.\n\t/// </summary>\n\tpublic View? Content\n\t{\n\t\tget => _content;\n\t\tset\n\t\t{\n\t\t\tvar oldContent = _content;\n\n\t\t\tif (SetProperty(ref _content, value))\n\t\t\t{\n\t\t\t\tOnContentChanged(oldContent, value);\n\t\t\t}\n\t\t}\n\t}\n\n\tSwipeItems? _leftItems;\n\tSwipeItems? _rightItems;\n\tSwipeItems? _topItems;\n\tSwipeItems? _bottomItems;\n\n\t/// <summary>\n\t/// Gets or sets the swipe items that can be invoked when the control is swiped from the left side.\n\t/// </summary>\n\tpublic SwipeItems? LeftItems\n\t{\n\t\tget => _leftItems;\n\t\tset => SetProperty(ref _leftItems, value);\n\t}\n\n\t/// <summary>\n\t/// Gets or sets the swipe items that can be invoked when the control is swiped from the right side.\n\t/// </summary>\n\tpublic SwipeItems? RightItems\n\t{\n\t\tget => _rightItems;\n\t\tset => SetProperty(ref _rightItems, value);\n\t}\n\n\t/// <summary>\n\t/// Gets or sets the swipe items that can be invoked when the control is swiped from the top down.\n\t/// </summary>\n\tpublic SwipeItems? TopItems\n\t{\n\t\tget => _topItems;\n\t\tset => SetProperty(ref _topItems, value);\n\t}\n\n\t/// <summary>\n\t/// Gets or sets the swipe items that can be invoked when the control is swiped from the bottom up.\n\t/// </summary>\n\tpublic SwipeItems? BottomItems\n\t{\n\t\tget => _bottomItems;\n\t\tset => SetProperty(ref _bottomItems, value);\n\t}\n\n\t/// <summary>\n\t/// Gets or sets the number of device-independent units that trigger a swipe gesture \n\t/// to fully reveal swipe items. Default is 0 (system default).\n\t/// </summary>\n\t[ObservableProperty]\n\tdouble _threshold;\n\n\t/// <summary>\n\t/// Gets or sets the action that is invoked when a swipe gesture starts.\n\t/// The action receives the SwipeView and SwipeDirection as parameters.\n\t/// </summary>\n\t[ObservableProperty]\n\tAction<SwipeView, SwipeDirection>? _swipeStarted;\n\n\t/// <summary>\n\t/// Gets or sets the action that is invoked as the swipe gesture changes.\n\t/// The action receives the SwipeView, SwipeDirection, and offset as parameters.\n\t/// </summary>\n\t[ObservableProperty]\n\tAction<SwipeView, SwipeDirection, double>? _swipeChanging;\n\n\t/// <summary>\n\t/// Gets or sets the action that is invoked when a swipe gesture ends.\n\t/// The action receives the SwipeView, SwipeDirection, and whether the view is open.\n\t/// </summary>\n\t[ObservableProperty]\n\tAction<SwipeView, SwipeDirection, bool>? _swipeEnded;\n\n\tpartial void OnContentChanged(View? oldContent, View? newContent);\n\n\t/// <summary>\n\t/// Programmatically opens the swipe items in the specified direction.\n\t/// </summary>\n\t/// <param name=\"direction\">The direction to open the swipe items.</param>\n\tpublic void Open(SwipeDirection direction)\n\t{\n\t\tOnOpen(direction);\n\t}\n\n\t/// <summary>\n\t/// Programmatically closes any open swipe items.\n\t/// </summary>\n\tpublic void Close()\n\t{\n\t\tOnClose();\n\t}\n\n\tpartial void OnOpen(SwipeDirection direction);\n\tpartial void OnClose();\n}\n"
  },
  {
    "path": "src/Spice/Core/Switch.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// A toggle switch control for boolean on/off input.\n/// Android -> AndroidX.AppCompat.Widget.SwitchCompat\n/// iOS -> UIKit.UISwitch\n/// </summary>\npublic partial class Switch : View\n{\n\t/// <summary>\n\t/// Whether the switch is in the on position\n\t/// </summary>\n\t[ObservableProperty]\n\tbool _isOn;\n\n\t/// <summary>\n\t/// Action to run when the switch is toggled\n\t/// </summary>\n\t[ObservableProperty]\n\tAction<Switch>? _toggled;\n}\n"
  },
  {
    "path": "src/Spice/Core/TabView.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// A view that displays bottom tabs for navigation between different content views.\n/// Platform implementations: iOS UITabBarController / Android BottomNavigationView\n/// </summary>\npublic partial class TabView : View\n{\n\t/// <summary>\n\t/// Adds a tab to the TabView. Supports collection initializer syntax.\n\t/// </summary>\n\t/// <param name=\"tab\">The tab to add.</param>\n\tpublic void Add(Tab tab)\n\t{\n\t\tArgumentNullException.ThrowIfNull(tab);\n\t\tChildren.Add(tab);\n\t}\n}\n\n/// <summary>\n/// Represents a single tab in a TabView.\n/// </summary>\npublic partial class Tab : View\n{\n\t/// <summary>\n\t/// Gets or sets the icon for the tab. Should be a resource name or path.\n\t/// </summary>\n\t[ObservableProperty]\n\tstring _icon = \"\";\n\n\tView? _content;\n\n\t/// <summary>\n\t/// Gets the content view for this tab.\n\t/// </summary>\n\tpublic View? Content\n\t{\n\t\tget => _content;\n\t\tprivate set\n\t\t{\n\t\t\tif (_content != value)\n\t\t\t{\n\t\t\t\t_content = value;\n\t\t\t\tif (_content != null && Children.Count == 0)\n\t\t\t\t{\n\t\t\t\t\tChildren.Add(_content);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Creates a Tab with a title, icon, and content view.\n\t/// </summary>\n\t/// <param name=\"title\">The title of the tab.</param>\n\t/// <param name=\"icon\">The icon resource name or path for the tab.</param>\n\t/// <param name=\"content\">The content view to display when this tab is selected.</param>\n\tpublic Tab(string title, string icon, View content)\n\t{\n\t\tArgumentNullException.ThrowIfNull(title);\n\t\tArgumentNullException.ThrowIfNull(icon);\n\t\tArgumentNullException.ThrowIfNull(content);\n\t\t\n\t\tTitle = title;\n\t\tIcon = icon;\n\t\tContent = content;\n\t}\n\n\t/// <summary>\n\t/// Creates a Tab with a title, icon, and a factory function for the content view.\n\t/// The content is created lazily when the tab is first selected.\n\t/// </summary>\n\t/// <param name=\"title\">The title of the tab.</param>\n\t/// <param name=\"icon\">The icon resource name or path for the tab.</param>\n\t/// <param name=\"factory\">A function that creates the content view.</param>\n\tpublic Tab(string title, string icon, Func<View> factory)\n\t{\n\t\tArgumentNullException.ThrowIfNull(title);\n\t\tArgumentNullException.ThrowIfNull(icon);\n\t\tArgumentNullException.ThrowIfNull(factory);\n\t\t\n\t\tTitle = title;\n\t\tIcon = icon;\n\t\t_contentFactory = factory;\n\t}\n\n\tFunc<View>? _contentFactory;\n\n\t/// <summary>\n\t/// Ensures content is created if it hasn't been already.\n\t/// Called by platform implementations when tab is first selected.\n\t/// </summary>\n\tpublic void EnsureContent()\n\t{\n\t\tif (Content == null && _contentFactory != null)\n\t\t{\n\t\t\tContent = _contentFactory();\n\t\t\t_contentFactory = null; // Release the factory after creating content\n\t\t}\n\t}\n}\n\n/// <summary>\n/// A Tab that creates its content view lazily using a parameterless constructor.\n/// </summary>\n/// <typeparam name=\"TContent\">The type of the content view. Must have a parameterless constructor.</typeparam>\npublic partial class Tab<TContent> : Tab where TContent : View, new()\n{\n\t/// <summary>\n\t/// Creates a Tab that will lazily create content of type TContent.\n\t/// </summary>\n\t/// <param name=\"title\">The title of the tab.</param>\n\t/// <param name=\"icon\">The icon resource name or path for the tab.</param>\n\tpublic Tab(string title, string icon) : base(title, icon, () => new TContent())\n\t{\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Core/Theme.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// Defines a set of semantic colors that are auto-applied to views.\n/// Extends ObservableObject so that changing a color fires PropertyChanged\n/// and updates all subscribed views live.\n/// </summary>\npublic partial class Theme : ObservableObject\n{\n\t// Avoid using the Colors class to prevent pulling Microsoft.Maui.Graphics\n\t// into the AOT-compiled output — keeps APK size down.\n\tstatic readonly Color Black = new(0f, 0f, 0f);\n\tstatic readonly Color White = new(1f, 1f, 1f);\n\tstatic readonly Color DarkGray = new(169f / 255f, 169f / 255f, 169f / 255f);\n\tstatic readonly Color LightGray = new(211f / 255f, 211f / 255f, 211f / 255f);\n\n\t/// <summary>Default text color for Label, Button, Entry, SearchBar, etc.</summary>\n\t[ObservableProperty]\n\tColor? _textColor;\n\n\t/// <summary>Default background color for all views.</summary>\n\t[ObservableProperty]\n\tColor? _backgroundColor;\n\n\t/// <summary>Accent/tint color for interactive controls (Button background, Switch tint, ActivityIndicator, etc.)</summary>\n\t[ObservableProperty]\n\tColor? _accentColor;\n\n\t/// <summary>Border/stroke color for Border views.</summary>\n\t[ObservableProperty]\n\tColor? _strokeColor;\n\n\t/// <summary>Placeholder text color for Editor, SearchBar, etc.</summary>\n\t[ObservableProperty]\n\tColor? _placeholderColor;\n\n\t/// <summary>\n\t/// A light theme with sensible defaults.\n\t/// </summary>\n\tpublic static Theme Light => new()\n\t{\n\t\tTextColor = Black,\n\t\tBackgroundColor = White,\n\t\tAccentColor = new Color(0f, 0.471f, 0.831f),       // #0078D4\n\t\tStrokeColor = new Color(0.878f, 0.878f, 0.878f),   // #E0E0E0\n\t\tPlaceholderColor = DarkGray,\n\t};\n\n\t/// <summary>\n\t/// A dark theme with sensible defaults.\n\t/// </summary>\n\tpublic static Theme Dark => new()\n\t{\n\t\tTextColor = White,\n\t\tBackgroundColor = new Color(0.118f, 0.118f, 0.118f), // #1E1E1E\n\t\tAccentColor = new Color(0.298f, 0.761f, 1f),         // #4CC2FF\n\t\tStrokeColor = new Color(0.251f, 0.251f, 0.251f),     // #404040\n\t\tPlaceholderColor = LightGray,\n\t};\n}\n"
  },
  {
    "path": "src/Spice/Core/Thickness.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// Represents the thickness of a frame around a rectangle. Four double values describe the Left, Top, Right, and Bottom sides of the rectangle.\n/// Aligns with Microsoft.Maui.Thickness for compatibility.\n/// </summary>\npublic struct Thickness : IEquatable<Thickness>\n{\n\t/// <summary>\n\t/// Gets or sets the width of the left side of the bounding rectangle\n\t/// </summary>\n\tpublic double Left { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the width of the top of the bounding rectangle\n\t/// </summary>\n\tpublic double Top { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the width of the right side of the bounding rectangle\n\t/// </summary>\n\tpublic double Right { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the width of the bottom of the bounding rectangle\n\t/// </summary>\n\tpublic double Bottom { get; set; }\n\n\t/// <summary>\n\t/// Initializes a new instance of Thickness with a uniform thickness on all sides\n\t/// </summary>\n\t/// <param name=\"uniformSize\">The uniform size applied to all sides</param>\n\tpublic Thickness(double uniformSize)\n\t{\n\t\tLeft = Top = Right = Bottom = uniformSize;\n\t}\n\n\t/// <summary>\n\t/// Initializes a new instance of Thickness with horizontal and vertical thickness\n\t/// </summary>\n\t/// <param name=\"horizontalSize\">The thickness on the left and right</param>\n\t/// <param name=\"verticalSize\">The thickness on the top and bottom</param>\n\tpublic Thickness(double horizontalSize, double verticalSize)\n\t{\n\t\tLeft = Right = horizontalSize;\n\t\tTop = Bottom = verticalSize;\n\t}\n\n\t/// <summary>\n\t/// Initializes a new instance of Thickness with different thickness values for each side\n\t/// </summary>\n\t/// <param name=\"left\">The thickness on the left</param>\n\t/// <param name=\"top\">The thickness on the top</param>\n\t/// <param name=\"right\">The thickness on the right</param>\n\t/// <param name=\"bottom\">The thickness on the bottom</param>\n\tpublic Thickness(double left, double top, double right, double bottom)\n\t{\n\t\tLeft = left;\n\t\tTop = top;\n\t\tRight = right;\n\t\tBottom = bottom;\n\t}\n\n\t/// <summary>\n\t/// Gets the horizontal thickness (Left + Right)\n\t/// </summary>\n\tpublic double HorizontalThickness => Left + Right;\n\n\t/// <summary>\n\t/// Gets the vertical thickness (Top + Bottom)\n\t/// </summary>\n\tpublic double VerticalThickness => Top + Bottom;\n\n\t/// <summary>\n\t/// Returns true if all sides are zero\n\t/// </summary>\n\tpublic bool IsEmpty => Left == 0 && Top == 0 && Right == 0 && Bottom == 0;\n\n\t/// <summary>\n\t/// Implicit conversion from double to Thickness with uniform size\n\t/// </summary>\n\tpublic static implicit operator Thickness(double uniformSize) => new(uniformSize);\n\n\t/// <summary>\n\t/// Determines whether two Thickness instances are equal\n\t/// </summary>\n\tpublic static bool operator ==(Thickness left, Thickness right) => left.Equals(right);\n\n\t/// <summary>\n\t/// Determines whether two Thickness instances are not equal\n\t/// </summary>\n\tpublic static bool operator !=(Thickness left, Thickness right) => !left.Equals(right);\n\n\t/// <summary>\n\t/// Determines whether this Thickness is equal to another Thickness\n\t/// </summary>\n\tpublic bool Equals(Thickness other) =>\n\t\tLeft == other.Left && Top == other.Top && Right == other.Right && Bottom == other.Bottom;\n\n\t/// <summary>\n\t/// Determines whether this Thickness is equal to another object\n\t/// </summary>\n\tpublic override bool Equals(object? obj) => obj is Thickness other && Equals(other);\n\n\t/// <summary>\n\t/// Returns a hash code for this Thickness\n\t/// </summary>\n\tpublic override int GetHashCode() => HashCode.Combine(Left, Top, Right, Bottom);\n\n\t/// <summary>\n\t/// Returns a string representation of the Thickness\n\t/// </summary>\n\tpublic override string ToString()\n\t{\n\t\tif (Left == Top && Left == Right && Left == Bottom)\n\t\t\treturn $\"{Left}\";\n\t\tif (Left == Right && Top == Bottom)\n\t\t\treturn $\"{Left},{Top}\";\n\t\treturn $\"{Left},{Top},{Right},{Bottom}\";\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Core/TimePicker.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// Represents a control that allows the user to select a time value.\n/// Android -> Android.App.TimePickerDialog\n/// iOS -> UIKit.UIDatePicker (Mode = Time)\n/// </summary>\npublic partial class TimePicker : View\n{\n\t/// <summary>\n\t/// The selected time value. Defaults to the current time.\n\t/// </summary>\n\t[ObservableProperty]\n\tTimeOnly _time = TimeOnly.FromDateTime(DateTime.Now);\n}\n"
  },
  {
    "path": "src/Spice/Core/TwoWayBindingExtensions.cs",
    "content": "using System.ComponentModel;\n\nnamespace Spice;\n\n/// <summary>\n/// Extension methods for two-way data-binding support in Spice.\n/// </summary>\npublic static class TwoWayBindingExtensions\n{\n\t/// <summary>\n\t/// Two-way binding: subscribes to PropertyChanged on both source and target,\n\t/// syncing changes in either direction. Includes guard to prevent infinite loops.\n\t/// Sets the initial value from source to target immediately.\n\t/// </summary>\n\t/// <typeparam name=\"TSource\">The type of the source object implementing INotifyPropertyChanged.</typeparam>\n\t/// <typeparam name=\"TValue\">The type of the property value.</typeparam>\n\t/// <param name=\"source\">The source object (typically a ViewModel).</param>\n\t/// <param name=\"sourceProperty\">The name of the source property (use nameof()).</param>\n\t/// <param name=\"sourceGetter\">Function to retrieve the property value from the source.</param>\n\t/// <param name=\"sourceSetter\">Action to set the property value on the source.</param>\n\t/// <param name=\"target\">The target object (typically a View).</param>\n\t/// <param name=\"targetProperty\">The name of the target property (use nameof()).</param>\n\t/// <param name=\"targetGetter\">Function to retrieve the property value from the target.</param>\n\t/// <param name=\"targetSetter\">Action to set the property value on the target.</param>\n\t/// <returns>An IDisposable that can be used to unsubscribe from both PropertyChanged events.</returns>\n\t/// <example>\n\t/// <code>\n\t/// var vm = new MyViewModel();\n\t/// var entry = new Entry();\n\t/// vm.BindTwoWay(\n\t///     nameof(vm.Username), v => v.Username, (v, val) => v.Username = val,\n\t///     entry,\n\t///     nameof(Entry.Text), () => entry.Text, val => entry.Text = val);\n\t/// </code>\n\t/// </example>\n\tpublic static IDisposable BindTwoWay<TSource, TValue>(\n\t\tthis TSource source,\n\t\tstring sourceProperty,\n\t\tFunc<TSource, TValue> sourceGetter,\n\t\tAction<TSource, TValue> sourceSetter,\n\t\tINotifyPropertyChanged target,\n\t\tstring targetProperty,\n\t\tFunc<TValue> targetGetter,\n\t\tAction<TValue> targetSetter)\n\t\twhere TSource : INotifyPropertyChanged\n\t{\n\t\tArgumentNullException.ThrowIfNull(source);\n\t\tArgumentNullException.ThrowIfNull(sourceProperty);\n\t\tArgumentNullException.ThrowIfNull(sourceGetter);\n\t\tArgumentNullException.ThrowIfNull(sourceSetter);\n\t\tArgumentNullException.ThrowIfNull(target);\n\t\tArgumentNullException.ThrowIfNull(targetProperty);\n\t\tArgumentNullException.ThrowIfNull(targetGetter);\n\t\tArgumentNullException.ThrowIfNull(targetSetter);\n\n\t\tbool updating = false;\n\n\t\t// Initial sync: source → target\n\t\ttargetSetter(sourceGetter(source));\n\n\t\tPropertyChangedEventHandler sourceHandler = (_, e) =>\n\t\t{\n\t\t\tif (!updating && e.PropertyName == sourceProperty)\n\t\t\t{\n\t\t\t\tupdating = true;\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\ttargetSetter(sourceGetter(source));\n\t\t\t\t}\n\t\t\t\tfinally\n\t\t\t\t{\n\t\t\t\t\tupdating = false;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tPropertyChangedEventHandler targetHandler = (_, e) =>\n\t\t{\n\t\t\tif (!updating && e.PropertyName == targetProperty)\n\t\t\t{\n\t\t\t\tupdating = true;\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tsourceSetter(source, targetGetter());\n\t\t\t\t}\n\t\t\t\tfinally\n\t\t\t\t{\n\t\t\t\t\tupdating = false;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tsource.PropertyChanged += sourceHandler;\n\t\ttarget.PropertyChanged += targetHandler;\n\n\t\treturn new TwoWayBindingSubscription(source, sourceHandler, target, targetHandler);\n\t}\n}\n\n/// <summary>\n/// Represents a two-way binding subscription that can be disposed to clean up both event handlers.\n/// </summary>\ninternal sealed class TwoWayBindingSubscription : IDisposable\n{\n\tprivate readonly INotifyPropertyChanged _source;\n\tprivate readonly PropertyChangedEventHandler _sourceHandler;\n\tprivate readonly INotifyPropertyChanged _target;\n\tprivate readonly PropertyChangedEventHandler _targetHandler;\n\tprivate bool _disposed;\n\n\tpublic TwoWayBindingSubscription(\n\t\tINotifyPropertyChanged source,\n\t\tPropertyChangedEventHandler sourceHandler,\n\t\tINotifyPropertyChanged target,\n\t\tPropertyChangedEventHandler targetHandler)\n\t{\n\t\t_source = source;\n\t\t_sourceHandler = sourceHandler;\n\t\t_target = target;\n\t\t_targetHandler = targetHandler;\n\t}\n\n\tpublic void Dispose()\n\t{\n\t\tif (!_disposed)\n\t\t{\n\t\t\t_source.PropertyChanged -= _sourceHandler;\n\t\t\t_target.PropertyChanged -= _targetHandler;\n\t\t\t_disposed = true;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Core/View.cs",
    "content": "using System.Collections;\nusing System.Collections.ObjectModel;\nusing System.Collections.Specialized;\n\nnamespace Spice;\n\n/// <summary>\n/// The base \"View\" type for all Spice views.\n/// </summary>\npublic partial class View : ObservableObject, IEnumerable<View>\n{\n\t/// <summary>\n\t/// Built-in theme property flags. An Int32 supports up to 32 properties.\n\t/// Custom views can define additional flags starting at <c>1 &lt;&lt; 5</c>.\n\t/// </summary>\n\t[Flags]\n\tpublic enum ThemeProperty\n\t{\n\t\t/// <summary>No property.</summary>\n\t\tNone            = 0,\n\t\t/// <summary>Background color of any view.</summary>\n\t\tBackgroundColor = 1 << 0,\n\t\t/// <summary>Text color for Label, Button, Entry, Editor, SearchBar, Picker, DatePicker.</summary>\n\t\tTextColor       = 1 << 1,\n\t\t/// <summary>Placeholder text color for Editor and SearchBar.</summary>\n\t\tPlaceholderColor= 1 << 2,\n\t\t/// <summary>Border stroke color.</summary>\n\t\tStroke          = 1 << 3,\n\t\t/// <summary>Accent color for ActivityIndicator.</summary>\n\t\tColor           = 1 << 4,\n\t}\n\n\tbool _isApplyingTheme;\n\tint _explicitProps;\n\tinternal Theme? _appliedTheme;\n\tbool _themeChildrenSubscribed;\n\n\t/// <summary>\n\t/// Tracks whether a theme property was explicitly set by the developer.\n\t/// When <paramref name=\"value\"/> is non-null the flag is set; when null it is cleared.\n\t/// </summary>\n\tpublic void TrackExplicit(int property, object? value)\n\t{\n\t\tif (!_isApplyingTheme)\n\t\t{\n\t\t\tif (value is not null)\n\t\t\t\t_explicitProps |= property;\n\t\t\telse\n\t\t\t\t_explicitProps &= ~property;\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Returns true when the theme property has not been explicitly set by the developer.\n\t/// </summary>\n\tpublic bool CanApplyTheme(int property) => (_explicitProps & property) == 0;\n\n\t/// <summary>\n\t/// Applies semantic theme colors to this view. Override in subclasses\n\t/// to map additional theme slots to view-specific properties.\n\t/// Only sets properties that the developer has not explicitly set.\n\t/// The <c>_isApplyingTheme</c> flag is managed by the caller.\n\t/// </summary>\n\tprotected virtual void ApplyTheme(Theme theme)\n\t{\n\t\tif (CanApplyTheme((int)ThemeProperty.BackgroundColor))\n\t\t\tBackgroundColor = theme.BackgroundColor;\n\t}\n\n\tinternal void ApplyThemeInternal(Theme theme)\n\t{\n\t\t_isApplyingTheme = true;\n\t\t_appliedTheme = theme;\n\n\t\tif (!_themeChildrenSubscribed)\n\t\t{\n\t\t\t_themeChildrenSubscribed = true;\n\t\t\tChildren.CollectionChanged += OnThemeChildrenChanged;\n\t\t}\n\n\t\tApplyTheme(theme);\n\t\t_isApplyingTheme = false;\n\t}\n\n\tpartial void OnBackgroundColorChanging(Color? value) => TrackExplicit((int)ThemeProperty.BackgroundColor, value);\n\n\tvoid OnThemeChildrenChanged(object? sender, NotifyCollectionChangedEventArgs e)\n\t{\n\t\tif (e.NewItems is not null && _appliedTheme is not null)\n\t\t{\n\t\t\tforeach (View child in e.NewItems)\n\t\t\t\tApplyThemeToTree(child, _appliedTheme);\n\t\t}\n\t}\n\n\tinternal static void ApplyThemeToTree(View? view, Theme theme)\n\t{\n\t\tif (view is null) return;\n\t\tview.ApplyThemeInternal(theme);\n\t\tforeach (var child in view.Children)\n\t\t\tApplyThemeToTree(child, theme);\n\t}\n\n\t/// <summary>\n\t/// Child views of this view\n\t/// </summary>\n\tpublic ObservableCollection<View> Children { get; set; } = new();\n\n\t/// <summary>\n\t/// Calls Children.Add(), collection initializer support\n\t/// </summary>\n\tpublic void Add(View item) => Children.Add(item);\n\n\t/// <summary>\n\t/// You can just foreach over this\n\t/// </summary>\n\tpublic IEnumerator<View> GetEnumerator() => Children.GetEnumerator();\n\n\tIEnumerator IEnumerable.GetEnumerator() => Children.GetEnumerator();\n\n\t/// <summary>\n\t/// The view's horizontal layout options.\n\t/// Platform implementations: UIKit.UIView.Frame / Android.Widget.RelativeLayout alignment rules\n\t/// </summary>\n\t[ObservableProperty]\n\tLayoutOptions _horizontalOptions;\n\n\t/// <summary>\n\t/// The view's vertical layout options.\n\t/// Platform implementations: UIKit.UIView.Frame / Android.Widget.RelativeLayout alignment rules\n\t/// </summary>\n\t[ObservableProperty]\n\tLayoutOptions _verticalOptions;\n\n\t/// <summary>\n\t/// Background color of the view\n\t/// </summary>\n\t[ObservableProperty]\n\tColor? _backgroundColor;\n\n\t/// <summary>\n\t/// Whether the view is visible. Defaults to true.\n\t/// </summary>\n\t[ObservableProperty]\n\tbool _isVisible = true;\n\n\t/// <summary>\n\t/// Whether the view is enabled (can respond to user interaction). Defaults to true.\n\t/// </summary>\n\t[ObservableProperty]\n\tbool _isEnabled = true;\n\n\tdouble _opacity = 1.0;\n\n\t/// <summary>\n\t/// Gets or sets the opacity of the view, ranging from 0.0 (fully transparent) to 1.0 (fully opaque). Defaults to 1.0.\n\t/// Values outside this range will be clamped.\n\t/// Platform implementations: UIKit.UIView.Alpha / Android.Views.View.Alpha\n\t/// </summary>\n\tpublic double Opacity\n\t{\n\t\tget => _opacity;\n\t\tset\n\t\t{\n\t\t\tvar clampedValue = Math.Clamp(value, 0.0, 1.0);\n\t\t\tif (SetProperty(ref _opacity, clampedValue))\n\t\t\t{\n\t\t\t\tOnOpacityChanged(clampedValue);\n\t\t\t}\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Gets or sets the automation identifier for UI testing.\n\t/// Platform implementations: UIKit.UIView.AccessibilityIdentifier / Android.Views.View.ContentDescription\n\t/// </summary>\n\t[ObservableProperty]\n\tstring? _automationId;\n\n\t/// <summary>\n\t/// Gets or sets the title of the view. Used by NavigationView for the navigation bar title and by Tab for the tab label.\n\t/// Ignored when the view is not inside a NavigationView or Tab.\n\t/// </summary>\n\t[ObservableProperty]\n\tstring _title = \"\";\n\n\t/// <summary>\n\t/// Gets the NavigationView that contains this view, if any. Set automatically when the view is pushed onto a NavigationView.\n\t/// </summary>\n\tpublic NavigationView? Navigation { get; internal set; }\n\n\t/// <summary>\n\t/// Presents a view modally over the current content.\n\t/// </summary>\n\t/// <param name=\"view\">The view to present.</param>\n\t/// <returns>A task that completes when the view has been presented.</returns>\n\tpublic Task PresentAsync(View view)\n\t{\n\t\tArgumentNullException.ThrowIfNull(view);\n\t\treturn PresentAsyncCore(view);\n\t}\n\n\t/// <summary>\n\t/// Presents a view created by a factory function modally over the current content.\n\t/// </summary>\n\t/// <param name=\"factory\">A function that creates the view to present.</param>\n\t/// <returns>A task that completes when the view has been presented.</returns>\n\tpublic Task PresentAsync(Func<View> factory)\n\t{\n\t\tArgumentNullException.ThrowIfNull(factory);\n\t\tvar view = factory();\n\t\treturn PresentAsync(view);\n\t}\n\n\t/// <summary>\n\t/// Presents a view of type T modally over the current content.\n\t/// The view is created using its parameterless constructor.\n\t/// </summary>\n\t/// <typeparam name=\"T\">The type of view to present. Must have a parameterless constructor.</typeparam>\n\t/// <returns>A task that completes when the view has been presented.</returns>\n\tpublic Task PresentAsync<T>() where T : View, new()\n\t{\n\t\treturn PresentAsync(new T());\n\t}\n\n\t/// <summary>\n\t/// Dismisses the currently presented modal view.\n\t/// </summary>\n\t/// <returns>A task that completes when the view has been dismissed.</returns>\n\tpublic Task DismissAsync()\n\t{\n\t\treturn DismissAsyncCore();\n\t}\n\n\t/// <summary>\n\t/// Platform-specific implementation of PresentAsync.\n\t/// </summary>\n#if VANILLA\n\tprivate Task PresentAsyncCore(View view) => Task.CompletedTask;\n#else\n\tprivate partial Task PresentAsyncCore(View view);\n#endif\n\n\t/// <summary>\n\t/// Platform-specific implementation of DismissAsync.\n\t/// </summary>\n#if VANILLA\n\tprivate Task DismissAsyncCore() => Task.CompletedTask;\n#else\n\tprivate partial Task DismissAsyncCore();\n#endif\n\n\t/// <summary>\n\t/// Called when the Opacity property changes\n\t/// </summary>\n\tpartial void OnOpacityChanged(double value);\n\n\t/// <summary>\n\t/// Space around the view. Supports uniform (10), horizontal/vertical (10,20), or individual sides (10,20,30,40).\n\t/// Aligns with Microsoft.Maui Margin property.\n\t/// </summary>\n\t[ObservableProperty]\n\tThickness _margin;\n\n\t/// <summary>\n\t/// Gets or sets the desired width of the view. \n\t/// Platform implementations: UIKit.UIView.Frame.Size / Android.Views.ViewGroup.LayoutParams.Width\n\t/// </summary>\n\t[ObservableProperty]\n\tdouble _widthRequest = -1;\n\n\t/// <summary>\n\t/// Gets or sets the desired height of the view.\n\t/// Platform implementations: UIKit.UIView.Frame.Size / Android.Views.ViewGroup.LayoutParams.Height\n\t/// </summary>\n\t[ObservableProperty]\n\tdouble _heightRequest = -1;\n\n\t/// <summary>\n\t/// Gets the actual rendered width of the view.\n\t/// Platform implementations: UIKit.UIView.Frame.Width / Android.Views.View.Width\n\t/// </summary>\n#if VANILLA\n\tpublic double Width => 0;\n#else\n\tpublic double Width => GetWidth();\n#endif\n\n\t/// <summary>\n\t/// Gets the actual rendered height of the view.\n\t/// Platform implementations: UIKit.UIView.Frame.Height / Android.Views.View.Height\n\t/// </summary>\n#if VANILLA\n\tpublic double Height => 0;\n#else\n\tpublic double Height => GetHeight();\n#endif\n\n#if !VANILLA\n\t/// <summary>\n\t/// Platform-specific implementation to get actual width\n\t/// </summary>\n\tprivate partial double GetWidth();\n\n\t/// <summary>\n\t/// Platform-specific implementation to get actual height\n\t/// </summary>\n\tprivate partial double GetHeight();\n\n#endif\n\n\t/// <summary>\n\t/// Recursively disposes a view and all its children if they implement IDisposable.\n\t/// Children are disposed before parents (bottom-up). Views that do not implement\n\t/// IDisposable are skipped.\n\t/// </summary>\n\tinternal static void DisposeRecursive(View view)\n\t{\n\t\tArgumentNullException.ThrowIfNull(view);\n\n\t\t// Dispose children first (bottom-up)\n\t\tforeach (var child in view.Children)\n\t\t{\n\t\t\tDisposeRecursive(child);\n\t\t}\n\n\t\t// Then dispose the view itself if it implements IDisposable\n\t\tif (view is IDisposable disposable)\n\t\t{\n\t\t\tdisposable.Dispose();\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/Spice/Core/WebView.cs",
    "content": "﻿namespace Spice;\n\n/// <summary>\n/// A \"web view\" for rendering HTML content on each platform.\n/// Android -> Android.Webkit.WebView\n/// iOS -> WebKit.WKWebView\n/// </summary>\npublic partial class WebView : View\n{\n\t/// <summary>\n\t/// The url to navigate to\n\t/// </summary>\n\t[ObservableProperty]\n\tstring _source = \"\";\n\n\t/// <summary>\n\t/// If JavaScript is enabled on the WebView. Defaults to true.\n\t/// </summary>\n\t[ObservableProperty]\n\tbool _isJavaScriptEnabled = true;\n}"
  },
  {
    "path": "src/Spice/GlobalUsings.cs",
    "content": "﻿global using CommunityToolkit.Mvvm.ComponentModel;\nglobal using Color = Microsoft.Maui.Graphics.Color;\n\n[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(\"Spice.Tests\")]"
  },
  {
    "path": "src/Spice/MSBuild/Spice.Blazor.targets",
    "content": "<!-- From: https://github.com/dotnet/maui/blob/2ccac2d3835d77a6548a7bb70773b5cf22b0f730/src/BlazorWebView/src/Maui/build/Microsoft.AspNetCore.Components.WebView.Maui.targets -->\n<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n\n  <!-- Enable Razor files to be visible in Solution Explorer because they are not Content files in .NET MAUI projects -->\n  <ItemGroup>\n    <AvailableItemName Include=\"RazorComponent\"/>\n  </ItemGroup>\n\n  <!-- Prevent Razor files from being packaged as bundle resources in iOS/MacCatalyst targets by declaring them\n       as RazorComponent instead of Content. -->\n  <ItemGroup Condition=\"'$(DesignTimeBuild)' != 'true'\">\n    <Content Remove=\"**\\*.razor\" />\n    <RazorComponent Include=\"**\\*.razor\" Exclude=\"$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)\" />\n  </ItemGroup>\n  \n  <!-- Ensure global.json isn't published with the app. -->\n  <ItemGroup>\n    <Content Update=\"global.json\" PublishFolderType=\"None\" />\n  </ItemGroup>\n\n  <PropertyGroup>\n    <StaticWebAssetBasePath>/</StaticWebAssetBasePath>\n    <StaticWebAssetProjectMode>Root</StaticWebAssetProjectMode>\n  </PropertyGroup>\n\n  <Target Name=\"ConvertStaticWebAssetsToMauiAssets\"\n      BeforeTargets=\"GetMauiItems;ResizetizeCollectItems;_CollectBundleResources;_CollectHotRestartBundleResources;_CheckForContent\"\n      DependsOnTargets=\"ResolveProjectReferences;StaticWebAssetsPrepareForRun;StaticWebAssetsPrepareForPublish;LoadStaticWebAssetsPublishManifest\">\n\n    <ComputeStaticWebAssetsTargetPaths Assets=\"@(StaticWebAsset)\" PathPrefix=\"wwwroot\">\n      <Output TaskParameter=\"AssetsWithTargetPath\" ItemName=\"_MauiStaticWebAssetWithTargetPath\" />\n    </ComputeStaticWebAssetsTargetPaths>\n\n    <ItemGroup>\n      <MauiAsset Include=\"%(_MauiStaticWebAssetWithTargetPath.Identity)\">\n        <Link>%(_MauiStaticWebAssetWithTargetPath.TargetPath)</Link>\n        <TargetPath>%(_MauiStaticWebAssetWithTargetPath.TargetPath)</TargetPath>\n      </MauiAsset>\n    </ItemGroup>\n\n    <!-- Update Content files that are managed by the Razor SDK to opt out of iOS and Android content-checks -->\n    <ItemGroup>\n      <!-- .razor.css scoped css files -->\n      <_ContentNotScopedCssFiles Include=\"@(Content)\" Exclude=\"@(ScopedCssInput)\" />\n      <_ContentToUpdate Include=\"@(Content)\" Exclude=\"@(_ContentNotScopedCssFiles)\" />\n\n      <!-- .razor files -->\n      <_ContentToUpdate Include=\"@(Content->WithMetadataValue('Extension', '.razor'))\" />\n\n      <Content Remove=\"@(_ContentToUpdate)\" />\n      <Content Include=\"@(_ContentToUpdate)\" ExcludeFromContentCheck=\"true\" PublishFolderType=\"None\" />\n\n      <!-- Remove the items in AppDesignerFolder (\"Properties\", by default) so they don't get copied to the output directory -->\n      <Content Remove=\"$(AppDesignerFolder)\\**\" Condition=\"'$(AppDesignerFolder)' != ''\" />\n    </ItemGroup>\n\n  </Target>\n\n  <Target Name=\"_RemoveStaticWebAssetsDevelopmentManifest\" BeforeTargets=\"GetCopyToOutputDirectoryItems\">\n    <!-- Remove the development manifest from the output since its not used and it will otherwise get incorrectly loaded in production. -->\n    <ItemGroup>\n      <ContentWithTargetPath Remove=\"$(StaticWebAssetDevelopmentManifestPath)\" />\n    </ItemGroup>\n  </Target>\n\n  <!-- Targets temporarily remove Content items in various folders so that they don't conflict with iOS/MacCatalyst SDK tasks -->\n  <Target Name=\"HideContentFromiOSBundleResources\" BeforeTargets=\"_CollectBundleResources\">\n    <ItemGroup>\n      <!-- Find all files outside the wwwroot folder -->\n      <_NonWWWRootContent Include=\"@(Content)\" Exclude=\"wwwroot/**/*\" />\n      <!-- Create a list of all content that *is* in the wwwroot folder (to preserve ItemGroup metadata) -->\n      <_TemporaryHiddenContent Include=\"@(Content)\" Exclude=\"@(_NonWWWRootContent)\" />\n      <!-- Add Scoped CSS files in the app to the list of hidden items -->\n      <_TemporaryHiddenContent Include=\"Components\\**\\*.razor.css\" />\n      <_TemporaryHiddenContent Include=\"Pages\\**\\*.razor.css\" />\n      <_TemporaryHiddenContent Include=\"Shared\\**\\*.razor.css\" />\n      <!-- Temporarily remove the items -->\n      <Content Remove=\"@(_TemporaryHiddenContent)\" />\n    </ItemGroup>\n  </Target>\n  <Target Name=\"RestoreHiddeniOSContent\" AfterTargets=\"_CollectBundleResources\" BeforeTargets=\"ResolveCurrentProjectStaticWebAssetsInputs\">\n    <ItemGroup>\n      <!-- Restore the previously removed Content items -->\n      <Content Include=\"@(_TemporaryHiddenContent)\" />\n    </ItemGroup>\n  </Target>\n\n  <!-- Handle hiding and restoring <Content /> from the iOS build in hot reload scenarios. -->\n  <Target Name=\"HideContentFromiOSHotRestartBundleResources\" BeforeTargets=\"_CollectHotRestartBundleResources\">\n    <ItemGroup>\n      <!-- Find all files outside the wwwroot folder -->\n      <_NonWWWRootContent Include=\"@(Content)\" Exclude=\"wwwroot/**/*\" />\n      <!-- Create a list of all content that *is* in the wwwroot folder (to preserve ItemGroup metadata) -->\n      <_TemporaryHiddenContent Include=\"@(Content)\" Exclude=\"@(_NonWWWRootContent)\" />\n      <!-- Add Scoped CSS files in the app to the list of hidden items -->\n      <_TemporaryHiddenContent Include=\"Components\\**\\*.razor.css\" />\n      <_TemporaryHiddenContent Include=\"Pages\\**\\*.razor.css\" />\n      <_TemporaryHiddenContent Include=\"Shared\\**\\*.razor.css\" />\n      <!-- Temporarily remove the items -->\n      <Content Remove=\"@(_TemporaryHiddenContent)\" />\n    </ItemGroup>\n  </Target>\n  <Target Name=\"RestoreHiddeniOSHotRestartContent\" AfterTargets=\"_CollectHotRestartBundleResources\" BeforeTargets=\"ResolveCurrentProjectStaticWebAssetsInputs\">\n    <ItemGroup>\n      <!-- Restore the previously removed Content items -->\n      <Content Include=\"@(_TemporaryHiddenContent)\" />\n    </ItemGroup>\n  </Target>\n\n  <!-- Targets temporarily remove Content items in various folders so that they don't conflict with Android SDK tasks -->\n  <Target Name=\"HideContentFromAndroidCheck\" BeforeTargets=\"_CheckForContent\">\n    <ItemGroup>\n      <_TemporaryAndroidHiddenContent Include=\"@(Content)\" />\n      <Content Remove=\"@(Content)\" />\n    </ItemGroup>\n  </Target>\n\n  <!-- Restore hidden Content items for Android -->\n  <Target Name=\"RestoreHiddenAndroidContent\" AfterTargets=\"_CheckForContent\">\n    <ItemGroup>\n      <Content Include=\"@(_TemporaryAndroidHiddenContent)\" />\n    </ItemGroup>\n  </Target>\n\n\n</Project>"
  },
  {
    "path": "src/Spice/MSBuild/Spice.props",
    "content": "﻿<Project>\n\t<PropertyGroup>\n\t\t<!-- To attempt XAML hot reload features one day -->\n\t\t<!--<IgnoreMauiXamlHotReloadCompatibilityCheck>true</IgnoreMauiXamlHotReloadCompatibilityCheck>-->\n\t\t<!-- Opt into full trimming mode; users can override in their csproj -->\n        <!-- Blazor projects don't work (https://github.com/dotnet/aspnetcore/issues/63951) -->\n\t\t<TrimMode Condition=\" '$(TrimMode)' == '' and '$(UsingMicrosoftNETSdkRazor)' != 'true' \">full</TrimMode>\n\t</PropertyGroup>\n\t<ItemGroup>\n\t\t<!-- This tells VS Windows to load XamarinVS -->\n\t\t<ProjectCapability Include=\"Maui\" />\n\t\t<!-- If we want to track Spice -->\n\t\t<ProjectCapability Include=\"Spice\" />\n\t</ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/Spice/MSBuild/Spice.targets",
    "content": "﻿<Project>\n\t<!--\n\t\tInlined from Microsoft.Maui.Controls SingleProject MSBuild logic (previously in Microsoft.Maui.Sdk.net7 workload SDK).\n\t\tIn .NET 8+, this was moved to the Microsoft.Maui.Controls.Build.Tasks NuGet package,\n\t\tbut Spice doesn't reference Microsoft.Maui.Controls, so we inline just the Android/iOS parts.\n\t\tSee: https://github.com/dotnet/maui/blob/main/src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/\n\t-->\n\t<PropertyGroup Condition=\" '$(SingleProject)' == 'true' \">\n\t\t<PlatformsProjectFolder Condition=\" '$(PlatformsProjectFolder)' == '' \">Platforms\\</PlatformsProjectFolder>\n\t\t<PlatformsProjectFolder>$([MSBuild]::EnsureTrailingSlash('$(PlatformsProjectFolder)'))</PlatformsProjectFolder>\n\t\t<_KeepLaunchProfiles>true</_KeepLaunchProfiles>\n\t\t<!-- Android -->\n\t\t<EnableDefaultAndroidItems>false</EnableDefaultAndroidItems>\n\t\t<AndroidProjectFolder Condition=\" '$(AndroidProjectFolder)' == '' \">$(PlatformsProjectFolder)Android\\</AndroidProjectFolder>\n\t\t<AndroidProjectFolder>$([MSBuild]::EnsureTrailingSlash('$(AndroidProjectFolder)'))</AndroidProjectFolder>\n\t\t<!-- iOS -->\n\t\t<EnableDefaultiOSItems>false</EnableDefaultiOSItems>\n\t\t<iOSProjectFolder Condition=\" '$(iOSProjectFolder)' == '' \">$(PlatformsProjectFolder)iOS\\</iOSProjectFolder>\n\t\t<iOSProjectFolder>$([MSBuild]::EnsureTrailingSlash('$(iOSProjectFolder)'))</iOSProjectFolder>\n\t</PropertyGroup>\n\n\t<ItemGroup>\n\t\t<MauiPlatformSpecificFolder Include=\"$(AndroidProjectFolder)\" TargetPlatformIdentifier=\"android\" />\n\t\t<MauiPlatformSpecificFolder Include=\"$(iOSProjectFolder)\" TargetPlatformIdentifier=\"ios\" />\n\t</ItemGroup>\n\n\t<PropertyGroup Condition=\" '$(SingleProject)' == 'true' and '$([MSBuild]::GetTargetPlatformIdentifier($(TargetFramework)))' == 'android' \">\n\t\t<AndroidManifest Condition=\" Exists('$(AndroidProjectFolder)AndroidManifest.xml') \">$(AndroidProjectFolder)AndroidManifest.xml</AndroidManifest>\n\t\t<MonoAndroidResourcePrefix>$(AndroidProjectFolder)Resources</MonoAndroidResourcePrefix>\n\t\t<MonoAndroidAssetsPrefix>$(AndroidProjectFolder)Assets</MonoAndroidAssetsPrefix>\n\t</PropertyGroup>\n\n\t<PropertyGroup Condition=\" '$(SingleProject)' == 'true' and '$([MSBuild]::GetTargetPlatformIdentifier($(TargetFramework)))' == 'ios' \">\n\t\t<IPhoneResourcePrefix>$(iOSProjectFolder)Resources</IPhoneResourcePrefix>\n\t\t<CodesignEntitlements Condition=\" '$(CodesignEntitlements)' == '' and Exists('$(iOSProjectFolder)Entitlements.plist') \">$(iOSProjectFolder)Entitlements.plist</CodesignEntitlements>\n\t</PropertyGroup>\n\n\t<ItemGroup Condition=\" '$(SingleProject)' == 'true' and '$([MSBuild]::GetTargetPlatformIdentifier($(TargetFramework)))' == 'ios' \">\n\t\t<None Include=\"$(iOSProjectFolder)Info.plist\" LogicalName=\"Info.plist\" Condition=\" Exists('$(iOSProjectFolder)Info.plist') \" />\n\t</ItemGroup>\n\n\t<ItemGroup Condition=\" '$(SingleProject)' == 'true' \">\n\t\t<!-- Add metadata indicating that the platform-specific files are not part of every build configuration. -->\n\t\t<Compile Update=\"$(PlatformsProjectFolder)**/*$(DefaultLanguageSourceExtension)\">\n\t\t\t<ExcludeFromCurrentConfiguration>true</ExcludeFromCurrentConfiguration>\n\t\t</Compile>\n\n\t\t<!-- Add metadata for the files that are actually part of the current build configuration. -->\n\t\t<Compile\n\t\t\tCondition=\" '$(TargetPlatformIdentifier)' == 'android' \"\n\t\t\tUpdate=\"$(AndroidProjectFolder)**/*$(DefaultLanguageSourceExtension)\">\n\t\t\t<ExcludeFromCurrentConfiguration>false</ExcludeFromCurrentConfiguration>\n\t\t</Compile>\n\t\t<Compile\n\t\t\tCondition=\" '$(TargetPlatformIdentifier)' == 'ios' \"\n\t\t\tUpdate=\"$(iOSProjectFolder)**/*$(DefaultLanguageSourceExtension)\">\n\t\t\t<ExcludeFromCurrentConfiguration>false</ExcludeFromCurrentConfiguration>\n\t\t</Compile>\n\t</ItemGroup>\n\n\t<Target Name=\"_SpiceRemovePlatformCompileItems\"\n\t\t\tBeforeTargets=\"GenerateMSBuildEditorConfigFileShouldRun\"\n\t\t\tCondition=\" '$(EnableDefaultItems)' == 'true' and '$(SingleProject)' == 'true' \">\n\t\t<ItemGroup>\n\t\t\t<!-- Remove everything that isn't part of this platform -->\n\t\t\t<Compile\n\t\t\t\tCondition=\" '%(Compile.ExcludeFromCurrentConfiguration)' == 'true' \"\n\t\t\t\tRemove=\"$(PlatformsProjectFolder)**/*$(DefaultLanguageSourceExtension)\" />\n\t\t</ItemGroup>\n\t</Target>\n\n\t<!-- IDE capabilities -->\n\t<ItemGroup Condition=\" '$(SingleProject)' == 'true' \">\n\t\t<ProjectCapability Include=\"MauiSingleProject\" />\n\t\t<ProjectCapability Include=\"LaunchProfiles\" />\n\t\t<ProjectCapability Include=\"LaunchProfilesGroupByPlatformFilters\" Condition=\" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &gt;= '17.0' \" />\n\t\t<ProjectCapability Include=\"SingleTargetBuildForStartupProjects\" Condition=\" '$(EnableSingleTargetBuildForStartupProjects)' != 'false' \" />\n\t</ItemGroup>\n\n\t<PropertyGroup Condition=\" '$(AndroidEnableProfiledAot)' == 'true' \">\n\t\t<AndroidUseDefaultAotProfile Condition=\" '$(AndroidUseDefaultAotProfile)' == '' \">false</AndroidUseDefaultAotProfile>\n\t\t<MauiUseDefaultAotProfile Condition=\" '$(MauiUseDefaultAotProfile)' == '' \">false</MauiUseDefaultAotProfile>\n\t</PropertyGroup>\n\n\t<ItemGroup Condition=\" '$(SpiceEnablePlatformUsings)' != 'true' and ('$(ImplicitUsings)' == 'true' or '$(ImplicitUsings)' == 'enable') \">\n\t\t<Using Remove=\"@(Using->HasMetadata('Platform'))\" />\n\t</ItemGroup>\n\n\t<ItemGroup Condition=\" '$(AndroidEnableProfiledAot)' == 'true' and '$(SpiceUseDefaultAotProfile)' != 'false' \">\n\t\t<AndroidAotProfile Include=\"$(MSBuildThisFileDirectory)spice.aotprofile\" />\n\t\t<AndroidAotProfile Include=\"$(MSBuildThisFileDirectory)spice-blazor.aotprofile\" />\n\t</ItemGroup>\n\n\t<!-- Microsoft.NET.Sdk.Razor signals to import this -->\n\t<Import Condition=\" '$(UsingMicrosoftNETSdkRazor)' == 'true' \" Project=\"Spice.Blazor.targets\" />\n</Project>"
  },
  {
    "path": "src/Spice/MSBuild/spice-blazor.aotprofile.txt",
    "content": "Methods:\n\tAndroid.App.Activity Java.Lang.Object:_GetObject (intptr,Android.Runtime.JniHandleOwnership)\n\tAndroid.App.Activity Java.Lang.Object:GetObject (intptr,Android.Runtime.JniHandleOwnership)\n\tAndroid.App.Activity Java.Lang.Object:GetObject (intptr,intptr,Android.Runtime.JniHandleOwnership)\n\tAndroid.Content.Context Android.Views.View:get_Context ()\n\tAndroid.Content.Res.AssetManager Android.Content.ContextWrapper:get_Assets ()\n\tAndroid.Net.Uri Android.Net.Uri:Parse (string)\n\tAndroid.Net.Uri Android.Webkit.IWebResourceRequestInvoker:get_Url ()\n\tAndroid.OS.Looper Android.OS.Looper:get_MainLooper ()\n\tAndroid.OS.Looper Android.OS.Looper:MyLooper ()\n\tAndroid.Runtime.IdentityHashTargets& System.Collections.Generic.Dictionary`2<System.IntPtr, Android.Runtime.IdentityHashTargets>:FindValue (intptr)\n\tAndroid.Views.View Spice.View:op_Implicit (Spice.View)\n\tAndroid.Views.View Spice.View/<>c__DisplayClass15_0:<.ctor>b__0 ()\n\tAndroid.Views.ViewGroup Spice.View:get_NativeView ()\n\tAndroid.Views.ViewGroup/LayoutParams Spice.Application:CreateLayoutParameters ()\n\tAndroid.Views.ViewGroup/LayoutParams Spice.View:CreateLayoutParameters ()\n\tAndroid.Views.ViewGroup/LayoutParams System.Lazy`1<Android.Views.ViewGroup/LayoutParams>:CreateValue ()\n\tAndroid.Views.ViewGroup/LayoutParams System.Lazy`1<Android.Views.ViewGroup/LayoutParams>:get_Value ()\n\tAndroid.Webkit.WebMessagePort[] Android.Webkit.WebView:CreateWebMessageChannel ()\n\tAndroid.Webkit.WebResourceResponse Spice.SpiceBlazorWebViewClient:ShouldInterceptRequest (Android.Webkit.WebView,Android.Webkit.IWebResourceRequest)\n\tAndroid.Webkit.WebSettings Android.Webkit.WebView:get_Settings ()\n\tAndroid.Webkit.WebView Spice.WebView:Create (Android.Content.Context)\n\tAndroid.Webkit.WebView Spice.WebView:get_NativeView ()\n\tAndroid.Widget.RelativeLayout Spice.View:Create (Android.Content.Context)\n\tbool Android.OS.Handler:Post (Java.Lang.IRunnable)\n\tbool Android.OS.Handler:Post (System.Action)\n\tbool Android.Runtime.AndroidTypeManager:FastRegisterNativeMembers (Java.Interop.JniType,System.Type,System.ReadOnlySpan`1<char>)\n\tbool Android.Runtime.AndroidTypeManager/MagicRegistrationMap:get_Filled ()\n\tbool Android.Runtime.JavaDictionary`2<System.String, System.String>:<ContainsKey>b__15_0 (intptr)\n\tbool Android.Runtime.JavaDictionary`2<System.String, System.String>:ContainsKey (string)\n\tbool Android.Runtime.JNIEnv:CallBooleanMethod (intptr,intptr,Android.Runtime.JValue[])\n\tbool Android.Runtime.JNIEnv:CallBooleanMethod (intptr,intptr,Android.Runtime.JValue*)\n\tbool Android.Runtime.JNIEnv:IsAssignableFrom (intptr,intptr)\n\tbool Android.Runtime.JNIEnv:IsGCUserPeer (intptr)\n\tbool Android.Runtime.JNIEnv:IsInstanceOf (intptr,intptr)\n\tbool Android.Runtime.Logger:get_LogGlobalRef ()\n\tbool Android.Runtime.XAPeerMembers:UsesVirtualDispatch (Java.Interop.IJavaPeerable,System.Type)\n\tbool Java.Interop.JavaConvert:WithLocalJniHandle (string,System.Func`2<intptr, bool>)\n\tbool Java.Interop.JniEnvironment/InstanceMethods:CallBooleanMethod (Java.Interop.JniObjectReference,Java.Interop.JniMethodInfo,Java.Interop.JniArgumentValue*)\n\tbool Java.Interop.JniEnvironment/InstanceMethods:CallNonvirtualBooleanMethod (Java.Interop.JniObjectReference,Java.Interop.JniObjectReference,Java.Interop.JniMethodInfo,Java.Interop.JniArgumentValue*)\n\tbool Java.Interop.JniEnvironment/Types:IsAssignableFrom (Java.Interop.JniObjectReference,Java.Interop.JniObjectReference)\n\tbool Java.Interop.JniEnvironment/Types:IsInstanceOf (Java.Interop.JniObjectReference,Java.Interop.JniObjectReference)\n\tbool Java.Interop.JniEnvironment/Types:IsSameObject (Java.Interop.JniObjectReference,Java.Interop.JniObjectReference)\n\tbool Java.Interop.JniEnvironmentInfo:get_IsValid ()\n\tbool Java.Interop.JniPeerMembers/JniInstanceMethods:InvokeNonvirtualBooleanMethod (string,Java.Interop.IJavaPeerable,Java.Interop.JniArgumentValue*)\n\tbool Java.Interop.JniPeerMembers/JniInstanceMethods:TryInvokeBooleanStaticRedirect (Java.Interop.JniMethodInfo,Java.Interop.IJavaPeerable,Java.Interop.JniArgumentValue*,bool&)\n\tbool Java.Interop.JniPeerMembers/JniInstanceMethods:TryInvokeObjectStaticRedirect (Java.Interop.JniMethodInfo,Java.Interop.IJavaPeerable,Java.Interop.JniArgumentValue*,Java.Interop.JniObjectReference&)\n\tbool Java.Interop.JniPeerMembers/JniInstanceMethods:TryInvokeVoidStaticRedirect (Java.Interop.JniMethodInfo,Java.Interop.IJavaPeerable,Java.Interop.JniArgumentValue*)\n\tbool Java.Interop.JniRuntime:GetBuiltInTypeArraySignature (System.Type,Java.Interop.JniTypeSignature&)\n\tbool Java.Interop.JniRuntime:GetBuiltInTypeSignature (System.Type,Java.Interop.JniTypeSignature&)\n\tbool Java.Interop.JniRuntime/JniObjectReferenceManager:get_LogGlobalReferenceMessages ()\n\tbool Java.Interop.JniType:TryGetStaticMethod (string,string,Java.Interop.JniMethodInfo&)\n\tbool Java.Interop.Runtime:IsGCUserPeer (intptr)\n\tbool Java.Interop.TypeManager:get_ActivationEnabled ()\n\tbool Java.Lang.Object:Java.Interop.IJavaObjectEx.get_IsProxy ()\n\tbool Java.Lang.Object:Java.Interop.IJavaObjectEx.get_NeedsActivation ()\n\tbool Microsoft.AspNetCore.Components.ChangeDetection:IsKnownImmutableType (System.Type)\n\tbool Microsoft.AspNetCore.Components.ChangeDetection:MayHaveChanged (object,object)\n\tbool Microsoft.AspNetCore.Components.EventCallback`1<Microsoft.AspNetCore.Components.Routing.NavigationContext>:get_HasDelegate ()\n\tbool Microsoft.AspNetCore.Components.EventCallback`1<Microsoft.AspNetCore.Components.Web.MouseEventArgs>:get_RequiresExplicitReceiver ()\n\tbool Microsoft.AspNetCore.Components.NavigationManager:TryGetLengthOfBaseUriPrefix (System.Uri,string,int&)\n\tbool Microsoft.AspNetCore.Components.ParameterView:DefinitelyEquals (Microsoft.AspNetCore.Components.ParameterView)\n\tbool Microsoft.AspNetCore.Components.ParameterView/CascadingParameterEnumerator:MoveNext ()\n\tbool Microsoft.AspNetCore.Components.ParameterView/Enumerator:MoveNext ()\n\tbool Microsoft.AspNetCore.Components.ParameterView/RenderTreeFrameParameterEnumerator:MoveNext ()\n\tbool Microsoft.AspNetCore.Components.Reflection.ComponentProperties/WritersForType:TryGetValue (string,Microsoft.AspNetCore.Components.Reflection.PropertySetter&)\n\tbool Microsoft.AspNetCore.Components.Reflection.MemberAssignment/<GetPropertiesIncludingInherited>d__0:MoveNext ()\n\tbool Microsoft.AspNetCore.Components.Reflection.PropertySetter:get_Cascading ()\n\tbool Microsoft.AspNetCore.Components.Rendering.SimplifiedStringHashComparer:Equals (string,string)\n\tbool Microsoft.AspNetCore.Components.Routing.NavLink:EqualsHrefExactlyOrIfTrailingSlashAdded (string)\n\tbool Microsoft.AspNetCore.Components.Routing.NavLink:ShouldMatch (string)\n\tbool Microsoft.AspNetCore.Components.Routing.RouteKey:Equals (Microsoft.AspNetCore.Components.Routing.RouteKey)\n\tbool Microsoft.AspNetCore.Components.WebView.ArrayBuilderMemoryStream:get_CanWrite ()\n\tbool Microsoft.AspNetCore.Components.WebView.FileExtensionContentTypeProvider:TryGetContentType (string,string&)\n\tbool Microsoft.AspNetCore.Components.WebView.IpcCommon:TryDeserialize (string,Microsoft.AspNetCore.Components.WebView.IpcCommon/IncomingMessageType&,System.ArraySegment`1<System.Text.Json.JsonElement>&)\n\tbool Microsoft.AspNetCore.Components.WebView.IpcCommon:TryDeserializeIncoming (string,Microsoft.AspNetCore.Components.WebView.IpcCommon/IncomingMessageType&,System.ArraySegment`1<System.Text.Json.JsonElement>&)\n\tbool Microsoft.AspNetCore.Components.WebView.Maui.AndroidAssetFileProvider/AndroidMauiAssetFileInfo:<.ctor>b__4_0 ()\n\tbool Microsoft.AspNetCore.Components.WebView.Maui.AndroidAssetFileProvider/AndroidMauiAssetFileInfo:get_Exists ()\n\tbool Microsoft.AspNetCore.Components.WebView.Maui.AndroidWebViewManager:TryGetResponseContentInternal (string,bool,int&,string&,System.IO.Stream&,System.Collections.Generic.IDictionary`2<string, string>&)\n\tbool Microsoft.AspNetCore.Components.WebView.StaticContentProvider:TryGetFrameworkFile (string,System.IO.Stream&,string&)\n\tbool Microsoft.AspNetCore.Components.WebView.StaticContentProvider:TryGetFromFileProvider (string,System.IO.Stream&,string&)\n\tbool Microsoft.AspNetCore.Components.WebView.StaticContentProvider:TryGetResponseContent (string,bool,int&,string&,System.IO.Stream&,System.Collections.Generic.IDictionary`2<string, string>&)\n\tbool Microsoft.AspNetCore.Components.WebView.WebViewManager:TryGetResponseContent (string,bool,int&,string&,System.IO.Stream&,System.Collections.Generic.IDictionary`2<string, string>&)\n\tbool Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey:Equals (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey)\n\tbool Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite:get_CaptureDisposable ()\n\tbool Microsoft.Extensions.DependencyInjection.ServiceLookup.StackGuard:TryEnterOnCurrentStack ()\n\tbool Microsoft.Extensions.FileProviders.Embedded.Manifest.EmbeddedFilesManifest:HasInvalidPathChars (string)\n\tbool Microsoft.Extensions.FileProviders.Embedded.Manifest.EmbeddedFilesManifest/<>c:<.cctor>b__8_0 (char)\n\tbool Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestFileInfo:get_Exists ()\n\tbool Microsoft.Extensions.Internal.ParameterDefaultValue:CheckHasDefaultValue (System.Reflection.ParameterInfo,bool&)\n\tbool Microsoft.Extensions.Internal.ParameterDefaultValue:TryGetDefaultValue (System.Reflection.ParameterInfo,object&)\n\tbool Microsoft.Extensions.Logging.Logger:IsEnabled (Microsoft.Extensions.Logging.LogLevel)\n\tbool Microsoft.Extensions.Logging.Logger`1<Microsoft.AspNetCore.Components.RenderTree.Renderer>:Microsoft.Extensions.Logging.ILogger.IsEnabled (Microsoft.Extensions.Logging.LogLevel)\n\tbool Microsoft.Extensions.Logging.LoggerFactory:CheckDisposed ()\n\tbool Microsoft.Extensions.Primitives.StringSegment:Equals (string)\n\tbool Microsoft.Extensions.Primitives.StringTokenizer/Enumerator:MoveNext ()\n\tbool Microsoft.JSInterop.Infrastructure.DotNetObjectReferenceJsonConverterFactory:CanConvert (System.Type)\n\tbool Microsoft.JSInterop.Infrastructure.JSObjectReferenceJsonConverter:CanConvert (System.Type)\n\tbool Microsoft.JSInterop.Infrastructure.JSStreamReferenceJsonConverter:CanConvert (System.Type)\n\tbool Microsoft.JSInterop.JSRuntime:EndInvokeJS (long,bool,System.Text.Json.Utf8JsonReader&)\n\tbool Spice.SpiceDispatcher:CheckAccess ()\n\tbool Spice.UriExtensions:IsBaseOfPage (System.Uri,string)\n\tbool System.AppContext:TryGetSwitch (string,bool&)\n\tbool System.AppContextConfigHelper:GetBooleanConfig (string,bool)\n\tbool System.AppContextConfigHelper:GetBooleanConfig (string,string,bool)\n\tbool System.Array:CanAssignArrayElement (System.Type,System.Type)\n\tbool System.Array:FastCopy (System.Array,int,System.Array,int,int)\n\tbool System.Attribute:IsDefined (System.Reflection.MemberInfo,System.Type)\n\tbool System.AttributeUsageAttribute:get_AllowMultiple ()\n\tbool System.AttributeUsageAttribute:get_Inherited ()\n\tbool System.Boolean:IsFalseStringIgnoreCase (System.ReadOnlySpan`1<char>)\n\tbool System.Boolean:IsTrueStringIgnoreCase (System.ReadOnlySpan`1<char>)\n\tbool System.Boolean:TryParse (string,bool&)\n\tbool System.Boolean:TryParse (System.ReadOnlySpan`1<char>,bool&)\n\tbool System.Buffers.ReadOnlySequence`1<System.Byte>:get_IsEmpty ()\n\tbool System.Buffers.StandardFormat:get_IsDefault ()\n\tbool System.Buffers.Text.Utf8Formatter:TryFormat (long,System.Span`1<byte>,int&,System.Buffers.StandardFormat)\n\tbool System.Buffers.Text.Utf8Parser:TryParse (System.ReadOnlySpan`1<byte>,long&,int&,char)\n\tbool System.Buffers.Text.Utf8Parser:TryParseInt64D (System.ReadOnlySpan`1<byte>,long&,int&)\n\tbool System.Byte:TryFormat (System.Span`1<char>,int&,System.ReadOnlySpan`1<char>,System.IFormatProvider)\n\tbool System.Char:IsLatin1 (char)\n\tbool System.Char:IsWhiteSpace (char)\n\tbool System.Char:IsWhiteSpaceLatin1 (char)\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2/Enumerator<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Cache`1/CacheEntry<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>>:MoveNext ()\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.AspNetCore.Components.Routing.RouteKey, Microsoft.AspNetCore.Components.Routing.RouteTable>:IsValueWriteAtomic ()\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.AspNetCore.Components.Routing.RouteKey, Microsoft.AspNetCore.Components.Routing.RouteTable>:TryAdd (Microsoft.AspNetCore.Components.Routing.RouteKey,Microsoft.AspNetCore.Components.Routing.RouteTable)\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.AspNetCore.Components.Routing.RouteKey, Microsoft.AspNetCore.Components.Routing.RouteTable>:TryAddInternal (Microsoft.AspNetCore.Components.Routing.RouteKey,System.Nullable`1<int>,Microsoft.AspNetCore.Components.Routing.RouteTable,bool,bool,Microsoft.AspNetCore.Components.Routing.RouteTable&)\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.AspNetCore.Components.Routing.RouteKey, Microsoft.AspNetCore.Components.Routing.RouteTable>:TryGetValue (Microsoft.AspNetCore.Components.Routing.RouteKey,Microsoft.AspNetCore.Components.Routing.RouteTable&)\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder/GeneratedMethod>:IsValueWriteAtomic ()\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder/GeneratedMethod>:TryAddInternal (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey,System.Nullable`1<int>,Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder/GeneratedMethod,bool,bool,Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder/GeneratedMethod&)\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder/GeneratedMethod>:TryGetValueInternal (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey,int,Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder/GeneratedMethod&)\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite>:IsValueWriteAtomic ()\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite>:TryAddInternal (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey,System.Nullable`1<int>,Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite,bool,bool,Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite&)\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite>:TryGetValue (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey,Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite&)\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, Microsoft.JSInterop.Infrastructure.IDotNetObjectReference>:IsValueWriteAtomic ()\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, Microsoft.JSInterop.Infrastructure.IDotNetObjectReference>:TryAddInternal (long,System.Nullable`1<int>,Microsoft.JSInterop.Infrastructure.IDotNetObjectReference,bool,bool,Microsoft.JSInterop.Infrastructure.IDotNetObjectReference&)\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, System.Object>:IsValueWriteAtomic ()\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, System.Object>:TryAddInternal (long,System.Nullable`1<int>,object,bool,bool,object&)\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, System.Object>:TryRemove (long,object&)\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, System.Object>:TryRemoveInternal (long,object&,bool,object)\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, System.Threading.CancellationTokenRegistration>:IsValueWriteAtomic ()\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, System.Threading.CancellationTokenRegistration>:TryRemove (long,System.Threading.CancellationTokenRegistration&)\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, System.Threading.CancellationTokenRegistration>:TryRemoveInternal (long,System.Threading.CancellationTokenRegistration&,bool,System.Threading.CancellationTokenRegistration)\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<System.Type, Microsoft.AspNetCore.Components.Web.Infrastructure.JSComponentInterop/ParameterTypeCache>:IsValueWriteAtomic ()\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<System.Type, System.Action`2<System.IServiceProvider, Microsoft.AspNetCore.Components.IComponent>>:TryAdd (System.Type,System.Action`2<System.IServiceProvider, Microsoft.AspNetCore.Components.IComponent>)\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<System.Type, System.Action`2<System.IServiceProvider, Microsoft.AspNetCore.Components.IComponent>>:TryGetValue (System.Type,System.Action`2<System.IServiceProvider, Microsoft.AspNetCore.Components.IComponent>&)\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<System.Type, System.Func`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope, System.Object>>:IsValueWriteAtomic ()\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<System.Type, System.Text.Json.Serialization.Metadata.JsonTypeInfo>:TryAddInternal (System.Type,System.Nullable`1<int>,System.Text.Json.Serialization.Metadata.JsonTypeInfo,bool,bool,System.Text.Json.Serialization.Metadata.JsonTypeInfo&)\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<System.Type, System.Text.Json.Serialization.Metadata.JsonTypeInfo>:TryGetValueInternal (System.Type,int,System.Text.Json.Serialization.Metadata.JsonTypeInfo&)\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<System.UInt64, System.Text.Json.JsonEncodedText>:IsValueWriteAtomic ()\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<System.UInt64, System.Text.Json.JsonEncodedText>:TryAdd (ulong,System.Text.Json.JsonEncodedText)\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<System.UInt64, System.Text.Json.JsonEncodedText>:TryAddInternal (ulong,System.Nullable`1<int>,System.Text.Json.JsonEncodedText,bool,bool,System.Text.Json.JsonEncodedText&)\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Cache`1/CacheEntry<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>>:IsValueWriteAtomic ()\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Cache`1/CacheEntry<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>>:TryAddInternal (System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>,System.Nullable`1<int>,System.Text.Json.Serialization.Metadata.ReflectionEmitCachingMemberAccessor/Cache`1/CacheEntry<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>>,bool,bool,System.Text.Json.Serialization.Metadata.ReflectionEmitCachingMemberAccessor/Cache`1/CacheEntry<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>>&)\n\tbool System.Collections.Concurrent.ConcurrentDictionary`2<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Cache`1/CacheEntry<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>>:TryGetValueInternal (System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>,int,System.Text.Json.Serialization.Metadata.ReflectionEmitCachingMemberAccessor/Cache`1/CacheEntry<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>>&)\n\tbool System.Collections.Concurrent.ConcurrentQueue`1<System.Object>:TryDequeue (object&)\n\tbool System.Collections.Concurrent.ConcurrentQueueSegment`1<System.Object>:TryDequeue (object&)\n\tbool System.Collections.Concurrent.ConcurrentQueueSegment`1<System.Object>:TryEnqueue (object)\n\tbool System.Collections.Generic.Dictionary`2/Enumerator<System.String, Microsoft.Extensions.Logging.Logger>:MoveNext ()\n\tbool System.Collections.Generic.Dictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, System.Object>:TryGetValue (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey,object&)\n\tbool System.Collections.Generic.Dictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, System.Object>:TryInsert (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey,object,System.Collections.Generic.InsertionBehavior)\n\tbool System.Collections.Generic.Dictionary`2<System.Action, Java.Lang.Thread/RunnableImplementor>:Remove (System.Action)\n\tbool System.Collections.Generic.Dictionary`2<System.Int32, Microsoft.AspNetCore.Components.Rendering.ComponentState>:TryGetValue (int,Microsoft.AspNetCore.Components.Rendering.ComponentState&)\n\tbool System.Collections.Generic.Dictionary`2<System.Int32, Microsoft.AspNetCore.Components.Rendering.ComponentState>:TryInsert (int,Microsoft.AspNetCore.Components.Rendering.ComponentState,System.Collections.Generic.InsertionBehavior)\n\tbool System.Collections.Generic.Dictionary`2<System.Int32, System.Boolean>:TryInsert (int,bool,System.Collections.Generic.InsertionBehavior)\n\tbool System.Collections.Generic.Dictionary`2<System.IntPtr, Android.Runtime.IdentityHashTargets>:Remove (intptr)\n\tbool System.Collections.Generic.Dictionary`2<System.IntPtr, Android.Runtime.IdentityHashTargets>:TryGetValue (intptr,Android.Runtime.IdentityHashTargets&)\n\tbool System.Collections.Generic.Dictionary`2<System.IntPtr, Android.Runtime.IdentityHashTargets>:TryInsert (intptr,Android.Runtime.IdentityHashTargets,System.Collections.Generic.InsertionBehavior)\n\tbool System.Collections.Generic.Dictionary`2<System.IntPtr, Java.Interop.JniRuntime>:TryGetValue (intptr,Java.Interop.JniRuntime&)\n\tbool System.Collections.Generic.Dictionary`2<System.IntPtr, Java.Interop.JniRuntime>:TryInsert (intptr,Java.Interop.JniRuntime,System.Collections.Generic.InsertionBehavior)\n\tbool System.Collections.Generic.Dictionary`2<System.IntPtr, System.IDisposable>:ContainsKey (intptr)\n\tbool System.Collections.Generic.Dictionary`2<System.IntPtr, System.IDisposable>:TryInsert (intptr,System.IDisposable,System.Collections.Generic.InsertionBehavior)\n\tbool System.Collections.Generic.Dictionary`2<System.String, Microsoft.AspNetCore.Components.Reflection.PropertySetter>:ContainsKey (string)\n\tbool System.Collections.Generic.Dictionary`2<System.String, Microsoft.AspNetCore.Components.WebView.WebViewManager/RootComponent>:TryAdd (string,Microsoft.AspNetCore.Components.WebView.WebViewManager/RootComponent)\n\tbool System.Collections.Generic.Dictionary`2<System.String, System.Int32>:TryAdd (string,int)\n\tbool System.Collections.Generic.Dictionary`2<System.String, System.Int32>:TryGetValue (string,int&)\n\tbool System.Collections.Generic.Dictionary`2<System.String, System.Int32>:TryInsert (string,int,System.Collections.Generic.InsertionBehavior)\n\tbool System.Collections.Generic.Dictionary`2<System.String, System.IntPtr>:TryGetValue (string,intptr&)\n\tbool System.Collections.Generic.Dictionary`2<System.String, System.IntPtr>:TryInsert (string,intptr,System.Collections.Generic.InsertionBehavior)\n\tbool System.Collections.Generic.Dictionary`2<System.String, System.Object>:TryInsert (string,object,System.Collections.Generic.InsertionBehavior)\n\tbool System.Collections.Generic.Dictionary`2<System.String, System.Type>:TryGetValue (string,System.Type&)\n\tbool System.Collections.Generic.Dictionary`2<System.Type, Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain/ChainItemInfo>:ContainsKey (System.Type)\n\tbool System.Collections.Generic.Dictionary`2<System.Type, Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain/ChainItemInfo>:Remove (System.Type)\n\tbool System.Collections.Generic.Dictionary`2<System.Type, Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain/ChainItemInfo>:TryInsert (System.Type,Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain/ChainItemInfo,System.Collections.Generic.InsertionBehavior)\n\tbool System.Collections.Generic.Dictionary`2<System.Type, Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory/ServiceDescriptorCacheItem>:TryGetValue (System.Type,Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory/ServiceDescriptorCacheItem&)\n\tbool System.Collections.Generic.Dictionary`2<System.Type, Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory/ServiceDescriptorCacheItem>:TryInsert (System.Type,Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory/ServiceDescriptorCacheItem,System.Collections.Generic.InsertionBehavior)\n\tbool System.Collections.Generic.Dictionary`2<System.UInt64, Microsoft.AspNetCore.Components.EventCallback>:TryInsert (ulong,Microsoft.AspNetCore.Components.EventCallback,System.Collections.Generic.InsertionBehavior)\n\tbool System.Collections.Generic.EnumEqualityComparer`1<Spice.Align>:Equals (Spice.Align,Spice.Align)\n\tbool System.Collections.Generic.GenericEqualityComparer`1<System.Int64>:Equals (long,long)\n\tbool System.Collections.Generic.GenericEqualityComparer`1<System.String>:Equals (string,string)\n\tbool System.Collections.Generic.HashSet`1/Enumerator<System.String>:MoveNext ()\n\tbool System.Collections.Generic.HashSet`1<System.Type>:Add (System.Type)\n\tbool System.Collections.Generic.HashSet`1<System.Type>:AddIfNotPresent (System.Type,int&)\n\tbool System.Collections.Generic.HashSet`1<System.Type>:Contains (System.Type)\n\tbool System.Collections.Generic.List`1/Enumerator<Spice.RootComponent>:MoveNext ()\n\tbool System.Collections.Generic.List`1/Enumerator<Spice.RootComponent>:MoveNextRare ()\n\tbool System.Collections.Generic.List`1/Enumerator<System.Collections.Generic.KeyValuePair`2<System.String, System.Text.Json.Serialization.Metadata.JsonPropertyInfo>>:MoveNext ()\n\tbool System.Collections.Generic.List`1/Enumerator<System.Collections.Generic.KeyValuePair`2<System.String, System.Text.Json.Serialization.Metadata.JsonPropertyInfo>>:MoveNextRare ()\n\tbool System.Collections.Generic.List`1/Enumerator<System.ValueTuple`3<System.String, System.Type, Microsoft.AspNetCore.Components.Reflection.PropertySetter>>:MoveNext ()\n\tbool System.Collections.Generic.List`1/Enumerator<System.ValueTuple`3<System.String, System.Type, Microsoft.AspNetCore.Components.Reflection.PropertySetter>>:MoveNextRare ()\n\tbool System.Collections.Generic.List`1<Spice.RootComponent>:System.Collections.Generic.ICollection<T>.get_IsReadOnly ()\n\tbool System.Collections.Generic.NonRandomizedStringEqualityComparer/OrdinalComparer:Equals (string,string)\n\tbool System.Collections.Generic.NonRandomizedStringEqualityComparer/OrdinalIgnoreCaseComparer:Equals (string,string)\n\tbool System.Collections.Generic.ObjectEqualityComparer`1<System.Type>:Equals (System.Type,System.Type)\n\tbool System.Collections.Generic.ReferenceEqualityComparer:Equals (object,object)\n\tbool System.Delegate:Equals (object)\n\tbool System.Delegate:IsArgumentTypeMatch (System.Type,System.Type)\n\tbool System.Delegate:IsArgumentTypeMatchWithThis (System.Type,System.Type,bool)\n\tbool System.Delegate:IsMatchingCandidate (System.RuntimeType,object,System.Reflection.MethodInfo,bool,System.DelegateData&)\n\tbool System.Delegate:IsReturnTypeMatch (System.Type,System.Type)\n\tbool System.Diagnostics.Tracing.EventSource:InitializeIsSupported ()\n\tbool System.Enum:GetEnumValuesAndNames (System.Runtime.CompilerServices.QCallTypeHandle,ulong[]&,string[]&)\n\tbool System.Enum:TryParse (System.Type,string,bool,bool,object&)\n\tbool System.Enum:TryParse (System.Type,System.ReadOnlySpan`1<char>,bool,bool,object&)\n\tbool System.Enum:TryParseByName (System.RuntimeType,System.ReadOnlySpan`1<char>,bool,bool,ulong&)\n\tbool System.Enum:TryParseInt32Enum (System.RuntimeType,System.ReadOnlySpan`1<char>,int,int,bool,bool,System.TypeCode,int&)\n\tbool System.Globalization.GlobalizationMode:get_Invariant ()\n\tbool System.Globalization.GlobalizationMode:TryGetAppLocalIcuSwitchValue (string&)\n\tbool System.Globalization.GlobalizationMode:TryGetStringValue (string,string,string&)\n\tbool System.Globalization.GlobalizationMode/Settings:get_Invariant ()\n\tbool System.Globalization.Ordinal:EqualsIgnoreCase (char&,char&,int)\n\tbool System.Int32:TryFormat (System.Span`1<char>,int&,System.ReadOnlySpan`1<char>,System.IFormatProvider)\n\tbool System.IO.File:Exists (string)\n\tbool System.IO.Path:EndsInDirectorySeparator (System.ReadOnlySpan`1<char>)\n\tbool System.IO.Path:HasExtension (string)\n\tbool System.IO.Path:HasExtension (System.ReadOnlySpan`1<char>)\n\tbool System.IO.Path:IsPathRooted (string)\n\tbool System.IO.Path:IsPathRooted (System.ReadOnlySpan`1<char>)\n\tbool System.IO.PathInternal:AreRootsEqual (string,string,System.StringComparison)\n\tbool System.IO.PathInternal:EndsInDirectorySeparator (System.ReadOnlySpan`1<char>)\n\tbool System.IO.PathInternal:RemoveRelativeSegments (System.ReadOnlySpan`1<char>,int,System.Text.ValueStringBuilder&)\n\tbool System.IO.UnmanagedMemoryStream:get_CanRead ()\n\tbool System.IO.UnmanagedMemoryStream:get_CanSeek ()\n\tbool System.IPv4AddressHelper:IsValid (char*,int,int&,bool,bool,bool)\n\tbool System.IPv4AddressHelper:Parse (string,byte*,int,int)\n\tbool System.Lazy`1<System.Boolean>:CreateValue ()\n\tbool System.Lazy`1<System.Boolean>:get_Value ()\n\tbool System.Linq.Enumerable:Any (System.Collections.Generic.IEnumerable`1<System.Xml.Linq.XElement>)\n\tbool System.Linq.Enumerable/AppendPrepend1Iterator`1<System.Object>:MoveNext ()\n\tbool System.Linq.Enumerable/AppendPrependIterator`1<System.Object>:LoadFromEnumerator ()\n\tbool System.Linq.Enumerable/WhereArrayIterator`1<System.Char>:MoveNext ()\n\tbool System.MemoryExtensions:Equals (System.ReadOnlySpan`1<char>,System.ReadOnlySpan`1<char>,System.StringComparison)\n\tbool System.MulticastDelegate:Equals (object)\n\tbool System.Number:<TryFormatInt32>g__TryFormatInt32Slow|39_0 (int,int,System.ReadOnlySpan`1<char>,System.IFormatProvider,System.Span`1<char>,int&)\n\tbool System.Number:TryFormatInt32 (int,int,System.ReadOnlySpan`1<char>,System.IFormatProvider,System.Span`1<char>,int&)\n\tbool System.Number:TryFormatUInt32 (uint,System.ReadOnlySpan`1<char>,System.IFormatProvider,System.Span`1<char>,int&)\n\tbool System.Number:TryInt32ToHexStr (int,char,int,System.Span`1<char>,int&)\n\tbool System.Number:TryUInt32ToDecStr (uint,int,System.Span`1<char>,int&)\n\tbool System.Object:Equals (object,object)\n\tbool System.Private.CoreLib.GateThread/DelayHelper:ShouldPerformGateActivities (int,bool)\n\tbool System.Private.CoreLib.Interop/Sys:LowLevelMonitor_TimedWait (intptr,int)\n\tbool System.Private.CoreLib.KeyCollection/Enumerator<System.String, System.String>:MoveNext ()\n\tbool System.Reflection.Assembly:Equals (object)\n\tbool System.Reflection.CustomAttribute:IsDefined (System.Reflection.ICustomAttributeProvider,System.Type,bool)\n\tbool System.Reflection.CustomAttribute:IsDefinedInternal (System.Reflection.ICustomAttributeProvider,System.Type)\n\tbool System.Reflection.CustomAttribute:IsUserCattrProvider (object)\n\tbool System.Reflection.CustomAttributeExtensions:IsDefined (System.Reflection.MemberInfo,System.Type)\n\tbool System.Reflection.Emit.ILGenerator:get_InExceptionBlock ()\n\tbool System.Reflection.MethodBase:get_IsPublic ()\n\tbool System.Reflection.MethodBase:get_IsStatic ()\n\tbool System.Reflection.MethodBase:get_IsVirtual ()\n\tbool System.Reflection.RuntimeMethodInfo:get_IsGenericMethodDefinition ()\n\tbool System.Reflection.RuntimeParameterInfo:get_HasDefaultValue ()\n\tbool System.Reflection.SignatureTypeExtensions:MatchesParameterTypeExactly (System.Type,System.Reflection.ParameterInfo)\n\tbool System.Runtime.CompilerServices.RuntimeHelpers:SufficientExecutionStack ()\n\tbool System.Runtime.CompilerServices.RuntimeHelpers:TryEnsureSufficientExecutionStack ()\n\tbool System.RuntimeType:CheckValue (object&,System.Reflection.ParameterCopyBackAction&,System.Reflection.Binder,System.Globalization.CultureInfo,System.Reflection.BindingFlags)\n\tbool System.RuntimeType:Equals (object)\n\tbool System.RuntimeType:FilterApplyConstructorInfo (System.Reflection.RuntimeConstructorInfo,System.Reflection.BindingFlags,System.Reflection.CallingConventions,System.Type[])\n\tbool System.RuntimeType:FilterApplyMethodBase (System.Reflection.MethodBase,System.Reflection.BindingFlags,System.Reflection.CallingConventions,System.Type[])\n\tbool System.RuntimeType:FilterApplyMethodInfo (System.Reflection.RuntimeMethodInfo,System.Reflection.BindingFlags,System.Reflection.CallingConventions,System.Type[])\n\tbool System.RuntimeType:get_ContainsGenericParameters ()\n\tbool System.RuntimeType:get_IsActualEnum ()\n\tbool System.RuntimeType:get_IsByRefLike ()\n\tbool System.RuntimeType:get_IsConstructedGenericType ()\n\tbool System.RuntimeType:get_IsEnum ()\n\tbool System.RuntimeType:get_IsGenericParameter ()\n\tbool System.RuntimeType:get_IsGenericType ()\n\tbool System.RuntimeType:get_IsGenericTypeDefinition ()\n\tbool System.RuntimeType:get_IsUserType ()\n\tbool System.RuntimeType:HasElementTypeImpl ()\n\tbool System.RuntimeType:IsArrayImpl ()\n\tbool System.RuntimeType:IsAssignableFrom (System.Type)\n\tbool System.RuntimeType:IsByRefImpl ()\n\tbool System.RuntimeType:IsDefined (System.Type,bool)\n\tbool System.RuntimeType:IsDelegate ()\n\tbool System.RuntimeType:IsInstanceOfType (object)\n\tbool System.RuntimeType:IsPointerImpl ()\n\tbool System.RuntimeType:IsPrimitiveImpl ()\n\tbool System.RuntimeType:IsSubclassOf (System.Type)\n\tbool System.RuntimeType:IsValueTypeImpl ()\n\tbool System.RuntimeTypeHandle:CanCastTo (System.RuntimeType,System.RuntimeType)\n\tbool System.RuntimeTypeHandle:HasElementType (System.RuntimeType)\n\tbool System.RuntimeTypeHandle:HasInstantiation (System.Runtime.CompilerServices.QCallTypeHandle)\n\tbool System.RuntimeTypeHandle:HasInstantiation (System.RuntimeType)\n\tbool System.RuntimeTypeHandle:is_subclass_of (System.Runtime.CompilerServices.QCallTypeHandle,System.Runtime.CompilerServices.QCallTypeHandle)\n\tbool System.RuntimeTypeHandle:IsArray (System.RuntimeType)\n\tbool System.RuntimeTypeHandle:IsByRef (System.RuntimeType)\n\tbool System.RuntimeTypeHandle:IsByRefLike (System.Runtime.CompilerServices.QCallTypeHandle)\n\tbool System.RuntimeTypeHandle:IsByRefLike (System.RuntimeType)\n\tbool System.RuntimeTypeHandle:IsGenericTypeDefinition (System.Runtime.CompilerServices.QCallTypeHandle)\n\tbool System.RuntimeTypeHandle:IsGenericTypeDefinition (System.RuntimeType)\n\tbool System.RuntimeTypeHandle:IsGenericVariable (System.RuntimeType)\n\tbool System.RuntimeTypeHandle:IsInstanceOfType (System.Runtime.CompilerServices.QCallTypeHandle,object)\n\tbool System.RuntimeTypeHandle:IsInstanceOfType (System.RuntimeType,object)\n\tbool System.RuntimeTypeHandle:IsInterface (System.RuntimeType)\n\tbool System.RuntimeTypeHandle:IsPointer (System.RuntimeType)\n\tbool System.RuntimeTypeHandle:IsPrimitive (System.RuntimeType)\n\tbool System.RuntimeTypeHandle:IsSubclassOf (System.RuntimeType,System.RuntimeType)\n\tbool System.RuntimeTypeHandle:IsValueType (System.RuntimeType)\n\tbool System.RuntimeTypeHandle:type_is_assignable_from (System.Runtime.CompilerServices.QCallTypeHandle,System.Runtime.CompilerServices.QCallTypeHandle)\n\tbool System.SpanHelpers:ContainsValueType (int16&,int16,int)\n\tbool System.SpanHelpers:SequenceEqual (byte&,byte&,uintptr)\n\tbool System.String:Contains (char)\n\tbool System.String:EndsWith (char)\n\tbool System.String:Equals (string,string,System.StringComparison)\n\tbool System.String:Equals (string,string)\n\tbool System.String:Equals (string)\n\tbool System.String:EqualsOrdinalIgnoreCase (string,string)\n\tbool System.String:EqualsOrdinalIgnoreCaseNoLengthCheck (string,string)\n\tbool System.String:IsNullOrWhiteSpace (string)\n\tbool System.String:op_Equality (string,string)\n\tbool System.String:op_Inequality (string,string)\n\tbool System.String:StartsWith (string,System.StringComparison)\n\tbool System.SZGenericArrayEnumerator`1<Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry>:MoveNext ()\n\tbool System.Text.ASCIIUtility:FirstCharInUInt32IsAscii (uint)\n\tbool System.Text.Encoding:get_IsUTF8CodePage ()\n\tbool System.Text.Json.JsonDocument:TryGetValue (int,long&)\n\tbool System.Text.Json.JsonDocument:TryParseValue (System.Text.Json.Utf8JsonReader&,System.Text.Json.JsonDocument&,bool,bool)\n\tbool System.Text.Json.JsonElement:TryGetInt64 (long&)\n\tbool System.Text.Json.JsonHelpers:IsDigit (byte)\n\tbool System.Text.Json.JsonSerializerOptions/TrackedCachingContexts:TryGetContext (System.Text.Json.JsonSerializerOptions,int,int&,System.Text.Json.JsonSerializerOptions/CachingContext&)\n\tbool System.Text.Json.JsonWriterHelper:NeedsEscapingNoBoundsCheck (char)\n\tbool System.Text.Json.Reflection.ReflectionExtensions:HasCustomAttributeWithName (System.Reflection.ICustomAttributeProvider,string,bool)\n\tbool System.Text.Json.Reflection.ReflectionExtensions:HasRequiredMemberAttribute (System.Reflection.ICustomAttributeProvider)\n\tbool System.Text.Json.Reflection.ReflectionExtensions:IsAssignableFromInternal (System.Type,System.Type)\n\tbool System.Text.Json.Reflection.ReflectionExtensions:IsImmutableDictionaryType (System.Type,bool)\n\tbool System.Text.Json.Reflection.ReflectionExtensions:IsImmutableEnumerableType (System.Type,bool)\n\tbool System.Text.Json.Reflection.ReflectionExtensions:IsInSubtypeRelationshipWith (System.Type,System.Type)\n\tbool System.Text.Json.Reflection.ReflectionExtensions:IsKeyValuePair (System.Type,System.Type)\n\tbool System.Text.Json.Reflection.ReflectionExtensions:TryGetDeserializationConstructor (System.Type,bool,System.Reflection.ConstructorInfo&)\n\tbool System.Text.Json.Serialization.Converters.EnumConverterFactory:CanConvert (System.Type)\n\tbool System.Text.Json.Serialization.Converters.FSharpTypeConverterFactory:CanConvert (System.Type)\n\tbool System.Text.Json.Serialization.Converters.IEnumerableConverterFactory:CanConvert (System.Type)\n\tbool System.Text.Json.Serialization.Converters.IEnumerableDefaultConverter`2<System.Collections.Generic.IEnumerable`1<System.Object>, System.Object>:OnWriteResume (System.Text.Json.Utf8JsonWriter,System.Collections.Generic.IEnumerable`1<object>,System.Text.Json.JsonSerializerOptions,System.Text.Json.WriteStack&)\n\tbool System.Text.Json.Serialization.Converters.IEnumerableOfTConverter`2<System.Collections.Generic.IEnumerable`1<System.Object>, System.Object>:get_SupportsCreateObjectDelegate ()\n\tbool System.Text.Json.Serialization.Converters.JsonNodeConverterFactory:CanConvert (System.Type)\n\tbool System.Text.Json.Serialization.Converters.NullableConverterFactory:CanConvert (System.Type)\n\tbool System.Text.Json.Serialization.Converters.ObjectConverterFactory:CanConvert (System.Type)\n\tbool System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>:get_SupportsCreateObjectDelegate ()\n\tbool System.Text.Json.Serialization.Converters.UnsupportedTypeConverterFactory:CanConvert (System.Type)\n\tbool System.Text.Json.Serialization.IAsyncEnumerableConverterFactory:CanConvert (System.Type)\n\tbool System.Text.Json.Serialization.JsonCollectionConverter`2<System.Collections.Generic.List`1<System.String>, System.String>:get_SupportsCreateObjectDelegate ()\n\tbool System.Text.Json.Serialization.JsonConverter:get_ConstructorIsParameterized ()\n\tbool System.Text.Json.Serialization.JsonConverter:get_SupportsCreateObjectDelegate ()\n\tbool System.Text.Json.Serialization.JsonConverter:ShouldFlush (System.Text.Json.Utf8JsonWriter,System.Text.Json.WriteStack&)\n\tbool System.Text.Json.Serialization.JsonConverter`1<Microsoft.AspNetCore.Components.ElementReference>:CanConvert (System.Type)\n\tbool System.Text.Json.Serialization.JsonConverter`1<Microsoft.AspNetCore.Components.ElementReference>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.JsonConverter`1<Microsoft.JSInterop.DotNetObjectReference`1<Microsoft.AspNetCore.Components.RenderTree.WebRenderer/WebRendererInteropMethods>>:TryWriteAsObject (System.Text.Json.Utf8JsonWriter,object,System.Text.Json.JsonSerializerOptions,System.Text.Json.WriteStack&)\n\tbool System.Text.Json.Serialization.JsonConverter`1<Microsoft.JSInterop.DotNetStreamReference>:CanConvert (System.Type)\n\tbool System.Text.Json.Serialization.JsonConverter`1<Microsoft.JSInterop.JSCallResultType>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.JsonConverter`1<Microsoft.JSInterop.JSCallResultType>:TryWrite (System.Text.Json.Utf8JsonWriter,Microsoft.JSInterop.JSCallResultType&,System.Text.Json.JsonSerializerOptions,System.Text.Json.WriteStack&)\n\tbool System.Text.Json.Serialization.JsonConverter`1<Microsoft.JSInterop.JSCallResultType>:TryWriteAsObject (System.Text.Json.Utf8JsonWriter,object,System.Text.Json.JsonSerializerOptions,System.Text.Json.WriteStack&)\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.Boolean>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.Byte>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.Char>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.DateOnly>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.DateTime>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.DateTimeOffset>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.Decimal>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.Double>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.Guid>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.Int16>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.Int32>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.Int32>:TryWrite (System.Text.Json.Utf8JsonWriter,int&,System.Text.Json.JsonSerializerOptions,System.Text.Json.WriteStack&)\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.Int32>:TryWriteAsObject (System.Text.Json.Utf8JsonWriter,object,System.Text.Json.JsonSerializerOptions,System.Text.Json.WriteStack&)\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.Int64>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.Int64>:TryWrite (System.Text.Json.Utf8JsonWriter,long&,System.Text.Json.JsonSerializerOptions,System.Text.Json.WriteStack&)\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.Int64>:TryWriteAsObject (System.Text.Json.Utf8JsonWriter,object,System.Text.Json.JsonSerializerOptions,System.Text.Json.WriteStack&)\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.SByte>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.Single>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.Text.Json.JsonElement>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.TimeOnly>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.TimeSpan>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.UInt16>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.UInt32>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.JsonConverter`1<System.UInt64>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.JsonResumableConverter`1<System.Collections.IDictionary>:get_HandleNull ()\n\tbool System.Text.Json.Serialization.Metadata.FSharpCoreReflectionProxy:IsFSharpType (System.Type)\n\tbool System.Text.Json.Serialization.Metadata.JsonPropertyInfo:NumberHandingIsApplicable ()\n\tbool System.Text.Json.Serialization.Metadata.JsonTypeInfo:IsByRefLike (System.Type)\n\tbool System.Text.Json.Serialization.Metadata.JsonTypeInfo:IsInvalidForSerialization (System.Type)\n\tbool System.Text.Json.Utf8JsonReader:ConsumeLiteral (System.ReadOnlySpan`1<byte>,System.Text.Json.JsonTokenType)\n\tbool System.Text.Json.Utf8JsonReader:ConsumeNextTokenOrRollback (byte)\n\tbool System.Text.Json.Utf8JsonReader:ConsumeNumber ()\n\tbool System.Text.Json.Utf8JsonReader:ConsumeString ()\n\tbool System.Text.Json.Utf8JsonReader:ConsumeValue (byte)\n\tbool System.Text.Json.Utf8JsonReader:get_IsLastSpan ()\n\tbool System.Text.Json.Utf8JsonReader:GetBoolean ()\n\tbool System.Text.Json.Utf8JsonReader:Read ()\n\tbool System.Text.Json.Utf8JsonReader:ReadFirstToken (byte)\n\tbool System.Text.Json.Utf8JsonReader:ReadSingleSegment ()\n\tbool System.Text.Json.Utf8JsonReader:TryGetInt64 (long&)\n\tbool System.Text.Json.Utf8JsonReader:TryGetNumber (System.ReadOnlySpan`1<byte>,int&)\n\tbool System.Text.Json.WriteStack:get_CurrentContainsMetadata ()\n\tbool System.Text.Rune:IsControl (System.Text.Rune)\n\tbool System.Threading.CancellationToken:get_IsCancellationRequested ()\n\tbool System.Threading.LowLevelLifoSemaphore:Wait (int,bool)\n\tbool System.Threading.LowLevelLifoSemaphore:WaitCore (int)\n\tbool System.Threading.LowLevelLifoSemaphore:WaitForSignal (int)\n\tbool System.Threading.LowLevelLock:TryAcquire ()\n\tbool System.Threading.LowLevelMonitor:Wait (int)\n\tbool System.Threading.LowLevelMonitor:WaitCore (int)\n\tbool System.Threading.PortableThreadPool:get_HasForcedMaxThreads ()\n\tbool System.Threading.PortableThreadPool:get_HasForcedMinThreads ()\n\tbool System.Threading.PortableThreadPool:NotifyWorkItemComplete (object,int)\n\tbool System.Threading.PortableThreadPool:OnGen2GCCallback ()\n\tbool System.Threading.PortableThreadPool:ShouldAdjustMaxWorkersActive (int)\n\tbool System.Threading.PortableThreadPool/WorkerThread:ShouldStopProcessingWorkNow (System.Threading.PortableThreadPool)\n\tbool System.Threading.PortableThreadPool/WorkerThread:TakeActiveRequest (System.Threading.PortableThreadPool)\n\tbool System.Threading.PortableThreadPool/WorkerThread:TryCreateWorkerThread ()\n\tbool System.Threading.Tasks.Task:AddTaskContinuation (object,bool)\n\tbool System.Threading.Tasks.Task:AtomicStateUpdate (int,int)\n\tbool System.Threading.Tasks.Task:get_IsCanceled ()\n\tbool System.Threading.Tasks.Task:TrySetResult ()\n\tbool System.Threading.Tasks.Task`1<System.Object>:TrySetResult (object)\n\tbool System.Threading.Tasks.Task`1<System.Threading.Tasks.VoidTaskResult>:TrySetResult (System.Threading.Tasks.VoidTaskResult)\n\tbool System.Threading.Tasks.TaskCompletionSource:TrySetResult ()\n\tbool System.Threading.Tasks.TaskCompletionSource`1<System.Object>:TrySetResult (object)\n\tbool System.Threading.Thread:Yield ()\n\tbool System.Threading.Thread:YieldInternal ()\n\tbool System.Threading.ThreadLocal`1<Java.Interop.JniEnvironmentInfo>:get_IsValueCreated ()\n\tbool System.Threading.ThreadPool:UnsafeQueueUserWorkItem (System.Threading.WaitCallback,object)\n\tbool System.Threading.ThreadPoolWorkQueue:Dispatch ()\n\tbool System.Threading.WaitHandle:WaitOne ()\n\tbool System.Threading.WaitHandle:WaitOne (int)\n\tbool System.Threading.WaitHandle:WaitOneNoCheck (int)\n\tbool System.Threading.WaitSubsystem/WaitableObject:get_IsAbandonedMutex ()\n\tbool System.Type:get_HasElementType ()\n\tbool System.Type:get_IsAbstract ()\n\tbool System.Type:get_IsArray ()\n\tbool System.Type:get_IsByRef ()\n\tbool System.Type:get_IsInterface ()\n\tbool System.Type:get_IsPointer ()\n\tbool System.Type:get_IsPrimitive ()\n\tbool System.Type:get_IsSealed ()\n\tbool System.Type:get_IsValueType ()\n\tbool System.Type:op_Equality (System.Type,System.Type)\n\tbool System.Type:op_Inequality (System.Type,System.Type)\n\tbool System.Uri:CheckForColonInFirstPathSegment (string)\n\tbool System.Uri:CheckForUnicodeOrEscapedUnreserved (string)\n\tbool System.Uri:get_DisablePathAndQueryCanonicalization ()\n\tbool System.Uri:IsBaseOf (System.Uri)\n\tbool System.Uri:IsBaseOfHelper (System.Uri)\n\tbool System.Uri:op_Equality (System.Uri,System.Uri)\n\tbool System.Uri:op_Inequality (System.Uri,System.Uri)\n\tbool System.UriHelper:IsLWS (char)\n\tbool System.UriHelper:TestForSubPath (char*,int,char*,int,bool)\n\tbool System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>:Equals (System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>)\n\tbool System.Xml.Linq.XContainer/<GetElements>d__39:MoveNext ()\n\tbool System.Xml.Linq.XContainer/<Nodes>d__18:MoveNext ()\n\tbool System.Xml.Linq.XContainer/ContentReader:ReadContentFrom (System.Xml.Linq.XContainer,System.Xml.XmlReader)\n\tbool System.Xml.Linq.XHashtable`1/XHashtableState<System.Xml.Linq.XName>:FindEntry (int,string,int,int,int&)\n\tbool System.Xml.Linq.XHashtable`1/XHashtableState<System.Xml.Linq.XName>:TryAdd (System.Xml.Linq.XName,System.Xml.Linq.XName&)\n\tbool System.Xml.Linq.XHashtable`1/XHashtableState<System.Xml.Linq.XName>:TryGetValue (string,int,int,System.Xml.Linq.XName&)\n\tbool System.Xml.Linq.XHashtable`1<System.Xml.Linq.XName>:TryGetValue (string,int,int,System.Xml.Linq.XName&)\n\tbool System.Xml.XmlConvert:StrEqual (char[],int,int,string)\n\tbool System.Xml.XmlNamespaceManager:PopScope ()\n\tbool System.Xml.XmlTextReaderImpl:get_EOF ()\n\tbool System.Xml.XmlTextReaderImpl:get_InAttributeValueIterator ()\n\tbool System.Xml.XmlTextReaderImpl:get_IsEmptyElement ()\n\tbool System.Xml.XmlTextReaderImpl:MoveToElement ()\n\tbool System.Xml.XmlTextReaderImpl:MoveToFirstAttribute ()\n\tbool System.Xml.XmlTextReaderImpl:MoveToNextAttribute ()\n\tbool System.Xml.XmlTextReaderImpl:ParseDocumentContent ()\n\tbool System.Xml.XmlTextReaderImpl:ParseElementContent ()\n\tbool System.Xml.XmlTextReaderImpl:ParseText ()\n\tbool System.Xml.XmlTextReaderImpl:ParseText (int&,int&,int&)\n\tbool System.Xml.XmlTextReaderImpl:ParseXmlDeclaration (bool)\n\tbool System.Xml.XmlTextReaderImpl:Read ()\n\tbool System.Xml.XmlTextReaderImpl:ReadDataInName (int&)\n\tbyte Java.Interop.NativeMethods:java_interop_jnienv_call_boolean_method_a (intptr,intptr&,intptr,intptr,intptr)\n\tbyte Java.Interop.NativeMethods:java_interop_jnienv_call_nonvirtual_boolean_method_a (intptr,intptr&,intptr,intptr,intptr,intptr)\n\tbyte Java.Interop.NativeMethods:java_interop_jnienv_is_assignable_from (intptr,intptr,intptr)\n\tbyte Java.Interop.NativeMethods:java_interop_jnienv_is_instance_of (intptr,intptr,intptr)\n\tbyte Java.Interop.NativeMethods:java_interop_jnienv_is_same_object (intptr,intptr,intptr)\n\tbyte[] Microsoft.AspNetCore.Components.WebView.ArrayBuilder`1<System.Byte>:get_Buffer ()\n\tbyte[] System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<System.Byte>:Rent (int)\n\tbyte[] System.GC:AllocateArray (int,bool)\n\tbyte[] System.GC:AllocateUninitializedArray (int,bool)\n\tbyte[] System.ReadOnlySpan`1<System.Byte>:ToArray ()\n\tbyte[] System.Text.UTF8Encoding/UTF8EncodingSealed:GetBytes (string)\n\tbyte[] System.Text.UTF8Encoding/UTF8EncodingSealed:GetBytesForSmallInput (string)\n\tbyte* System.Private.CoreLib.Interop/Sys:<GetCwd>g____PInvoke|34_0 (byte*,int)\n\tbyte* System.Private.CoreLib.Interop/Sys:GetCwd (byte*,int)\n\tbyte* System.Text.Unicode.Utf8Utility:GetPointerToFirstInvalidByte (byte*,int,int&,int&)\n\tchar modreq System.ReadOnlySpan`1<System.Char>:GetPinnableReference (System.Runtime.InteropServices.InAttribute)& System.ReadOnlySpan`1<System.Char>:GetPinnableReference ()\n\tchar System.Char:ToLowerInvariant (char)\n\tchar System.Globalization.TextInfo:ToLowerInvariant (char)\n\tchar System.Linq.Enumerable/Iterator`1<System.Char>:get_Current ()\n\tchar System.Number:ParseFormatSpecifier (System.ReadOnlySpan`1<char>,int&)\n\tchar[] System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<System.Char>:Rent (int)\n\tchar[] System.Collections.Generic.ArrayBuilder`1<System.Char>:ToArray ()\n\tchar[] System.Collections.Generic.EnumerableHelpers:ToArray (System.Collections.Generic.IEnumerable`1<char>)\n\tchar[] System.Collections.Generic.LargeArrayBuilder`1<System.Char>:ToArray ()\n\tchar[] System.GC:AllocateArray (int,bool)\n\tchar[] System.GC:AllocateUninitializedArray (int,bool)\n\tchar[] System.IO.Path:GetInvalidPathChars ()\n\tchar[] System.Linq.Enumerable:ToArray (System.Collections.Generic.IEnumerable`1<char>)\n\tchar* Java.Interop.JniEnvironment/Strings:GetStringChars (Java.Interop.JniObjectReference,bool*)\n\tchar* Java.Interop.NativeMethods:java_interop_jnienv_get_string_chars (intptr,intptr,bool*)\n\tchar* System.Text.Unicode.Utf16Utility:GetPointerToFirstInvalidChar (char*,int,long&,int&)\n\tdouble System.BitConverter:UInt64BitsToDouble (ulong)\n\tdouble System.Math:Pow (double,double)\n\tdouble System.Private.CoreLib.Interop/Sys:<GetCpuUtilization>g____PInvoke|33_0 (Interop/Sys/ProcessCpuInformation*)\n\tdouble System.Private.CoreLib.Interop/Sys:GetCpuUtilization (Interop/Sys/ProcessCpuInformation&)\n\tdouble System.Threading.PortableThreadPool/CpuUtilizationReader:get_CurrentUtilization ()\n\tint Android.Runtime.AndroidObjectReferenceManager:_monodroid_gref_get ()\n\tint Android.Runtime.AndroidObjectReferenceManager:get_GlobalReferenceCount ()\n\tint Android.Runtime.AndroidTypeManager:CountMethods (System.ReadOnlySpan`1<char>)\n\tint Android.Runtime.IdentityHashTargets:get_Count ()\n\tint Android.Runtime.InputStreamAdapter:Read (byte[],int,int)\n\tint Android.Runtime.JNIEnv:_GetArrayLength (intptr)\n\tint Android.Runtime.JNIEnv:_monodroid_gref_log_new (intptr,byte,intptr,byte,string,int,System.Text.StringBuilder,int)\n\tint Android.Runtime.JNINativeWrapper:Wrap_JniMarshal_PPLII_I (_JniMarshal_PPLII_I,intptr,intptr,intptr,int,int)\n\tint Java.Interop.JniEnvironment/Arrays:GetArrayLength (Java.Interop.JniObjectReference)\n\tint Java.Interop.JniEnvironment/References:GetJavaVM (intptr,intptr&)\n\tint Java.Interop.JniEnvironment/Strings:GetStringLength (Java.Interop.JniObjectReference)\n\tint Java.Interop.JniEnvironment/Types:_RegisterNatives (Java.Interop.JniObjectReference,Java.Interop.JniNativeMethodRegistration[],int)\n\tint Java.Interop.JniPeerMembers:GetSignatureSeparatorIndex (string)\n\tint Java.Interop.NativeMethods:java_interop_jnienv_get_array_length (intptr,intptr)\n\tint Java.Interop.NativeMethods:java_interop_jnienv_get_java_vm (intptr,intptr&)\n\tint Java.Interop.NativeMethods:java_interop_jnienv_get_string_length (intptr,intptr)\n\tint Java.Interop.NativeMethods:java_interop_jnienv_register_natives (intptr,intptr&,intptr,Java.Interop.JniNativeMethodRegistration[],int)\n\tint Java.Interop.Tools.TypeNameMappings.JavaNativeTypeManager:GetArrayInfo (System.Type,System.Type&)\n\tint Java.IO.InputStream:n_Read_arrayBII (intptr,intptr,intptr,int,int)\n\tint Microsoft.AspNetCore.Components.Rendering.SimplifiedStringHashComparer:GetHashCode (string)\n\tint Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>:Append (Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame[],int,int)\n\tint Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>:Append (System.ReadOnlySpan`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>)\n\tint Microsoft.AspNetCore.Components.RenderTree.Renderer:AssignRootComponentId (Microsoft.AspNetCore.Components.IComponent)\n\tint Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder:NextSiblingIndex (Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame&,int)\n\tint Microsoft.AspNetCore.Components.RenderTree.WebRenderer:AddRootComponent (System.Type,string)\n\tint Microsoft.AspNetCore.Components.Routing.RouteKey:GetHashCode ()\n\tint Microsoft.AspNetCore.Components.WebView.ArrayBuilder`1<System.Byte>:Append (byte[],int,int)\n\tint Microsoft.AspNetCore.Components.WebView.ArrayBuilder`1<System.Byte>:Append (System.ReadOnlySpan`1<byte>)\n\tint Microsoft.AspNetCore.Components.WebView.ArrayBuilder`1<System.Byte>:get_Count ()\n\tint Microsoft.AspNetCore.Components.WebView.RenderBatchWriter:Write (Microsoft.AspNetCore.Components.RenderTree.ArrayRange`1<int>&)\n\tint Microsoft.AspNetCore.Components.WebView.RenderBatchWriter:Write (Microsoft.AspNetCore.Components.RenderTree.ArrayRange`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff>&)\n\tint Microsoft.AspNetCore.Components.WebView.RenderBatchWriter:Write (Microsoft.AspNetCore.Components.RenderTree.ArrayRange`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>&)\n\tint Microsoft.AspNetCore.Components.WebView.RenderBatchWriter:Write (Microsoft.AspNetCore.Components.RenderTree.ArrayRange`1<ulong>&)\n\tint Microsoft.AspNetCore.Components.WebView.RenderBatchWriter:WriteStringTable ()\n\tint Microsoft.AspNetCore.Components.WebView.Services.WebViewRenderer:AddRootComponent (System.Type,string)\n\tint Microsoft.Extensions.DependencyInjection.ServiceCollection:get_Count ()\n\tint Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory/<>c:<CreateConstructorCallSite>b__23_0 (System.Reflection.ConstructorInfo,System.Reflection.ConstructorInfo)\n\tint Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey:GetHashCode ()\n\tint Microsoft.Extensions.Logging.LogValuesFormatter:FindBraceIndex (string,char,int,int)\n\tint Microsoft.Extensions.Logging.LogValuesFormatter:FindIndexOfAny (string,char[],int,int)\n\tint Microsoft.Extensions.Primitives.StringSegment:get_Length ()\n\tint Microsoft.Extensions.Primitives.StringSegment:IndexOfAny (char[],int)\n\tint System.AppContextConfigHelper:GetInt32Config (string,int,bool)\n\tint System.Array:GetLength (int)\n\tint System.Array:GetLowerBound (int)\n\tint System.Array:IndexOf (char[],char,int,int)\n\tint System.Array:IndexOf (char[],char)\n\tint System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.AspNetCore.Components.Routing.RouteKey, Microsoft.AspNetCore.Components.Routing.RouteTable>:get_DefaultConcurrencyLevel ()\n\tint System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder/GeneratedMethod>:get_DefaultConcurrencyLevel ()\n\tint System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite>:get_DefaultConcurrencyLevel ()\n\tint System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, Microsoft.JSInterop.Infrastructure.IDotNetObjectReference>:get_DefaultConcurrencyLevel ()\n\tint System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, System.Object>:get_DefaultConcurrencyLevel ()\n\tint System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, System.Threading.CancellationTokenRegistration>:get_DefaultConcurrencyLevel ()\n\tint System.Collections.Concurrent.ConcurrentDictionary`2<System.String, Microsoft.AspNetCore.Components.Reflection.PropertySetter>:get_Count ()\n\tint System.Collections.Concurrent.ConcurrentDictionary`2<System.String, Microsoft.AspNetCore.Components.Reflection.PropertySetter>:GetCountInternal ()\n\tint System.Collections.Concurrent.ConcurrentDictionary`2<System.Type, Microsoft.AspNetCore.Components.Web.Infrastructure.JSComponentInterop/ParameterTypeCache>:get_DefaultConcurrencyLevel ()\n\tint System.Collections.Concurrent.ConcurrentDictionary`2<System.Type, System.Func`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope, System.Object>>:get_DefaultConcurrencyLevel ()\n\tint System.Collections.Concurrent.ConcurrentDictionary`2<System.UInt64, System.Text.Json.JsonEncodedText>:get_DefaultConcurrencyLevel ()\n\tint System.Collections.Concurrent.ConcurrentDictionary`2<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Cache`1/CacheEntry<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>>:get_DefaultConcurrencyLevel ()\n\tint System.Collections.Generic.Dictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, System.Object>:Initialize (int)\n\tint System.Collections.Generic.Dictionary`2<System.Int32, Microsoft.AspNetCore.Components.Rendering.ComponentState>:Initialize (int)\n\tint System.Collections.Generic.Dictionary`2<System.Int32, System.Boolean>:Initialize (int)\n\tint System.Collections.Generic.Dictionary`2<System.IntPtr, Android.Runtime.IdentityHashTargets>:Initialize (int)\n\tint System.Collections.Generic.Dictionary`2<System.IntPtr, Java.Interop.JniRuntime>:Initialize (int)\n\tint System.Collections.Generic.Dictionary`2<System.IntPtr, System.IDisposable>:Initialize (int)\n\tint System.Collections.Generic.Dictionary`2<System.String, System.Int32>:get_Item (string)\n\tint System.Collections.Generic.Dictionary`2<System.String, System.Int32>:Initialize (int)\n\tint System.Collections.Generic.Dictionary`2<System.String, System.IntPtr>:Initialize (int)\n\tint System.Collections.Generic.Dictionary`2<System.String, System.Object>:Initialize (int)\n\tint System.Collections.Generic.Dictionary`2<System.Type, Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain/ChainItemInfo>:Initialize (int)\n\tint System.Collections.Generic.Dictionary`2<System.Type, Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory/ServiceDescriptorCacheItem>:Initialize (int)\n\tint System.Collections.Generic.Dictionary`2<System.UInt64, Microsoft.AspNetCore.Components.EventCallback>:Initialize (int)\n\tint System.Collections.Generic.HashSet`1<System.Type>:FindItemIndex (System.Type)\n\tint System.Collections.Generic.HashSet`1<System.Type>:Initialize (int)\n\tint System.Collections.Generic.List`1<Spice.RootComponent>:get_Count ()\n\tint System.Collections.Generic.List`1<System.Int32>:EnsureCapacity (int)\n\tint System.Collections.Generic.List`1<System.Int32>:get_Item (int)\n\tint System.Collections.Generic.NonRandomizedStringEqualityComparer/OrdinalComparer:GetHashCode (string)\n\tint System.Collections.Generic.NonRandomizedStringEqualityComparer/OrdinalIgnoreCaseComparer:GetHashCode (string)\n\tint System.Collections.Generic.ReferenceEqualityComparer:GetHashCode (object)\n\tint System.Collections.Generic.Stack`1<System.Int32>:Peek ()\n\tint System.Collections.Generic.Stack`1<System.Int32>:Pop ()\n\tint System.Collections.HashHelpers:ExpandPrime (int)\n\tint System.Collections.HashHelpers:GetPrime (int)\n\tint System.Collections.Hashtable:GetHash (object)\n\tint System.Collections.ObjectModel.Collection`1<Spice.RootComponent>:get_Count ()\n\tint System.Convert:ToBase64_CalculateAndValidateOutputLength (int,bool)\n\tint System.Delegate:GetHashCode ()\n\tint System.Environment:get_CurrentManagedThreadId ()\n\tint System.Environment:get_TickCount ()\n\tint System.Environment:GetProcessorCount ()\n\tint System.Globalization.GlobalizationMode:LoadICU ()\n\tint System.Globalization.Ordinal:CompareStringIgnoreCase (char&,int,char&,int)\n\tint System.Globalization.Ordinal:IndexOf (string,string,int,int,bool)\n\tint System.HashCode:Combine (int,int,int)\n\tint System.HashCode:ToHashCode ()\n\tint System.IO.Path:GetDirectoryNameOffset (System.ReadOnlySpan`1<char>)\n\tint System.IO.PathInternal:EqualStartingCharacterCount (string,string,bool)\n\tint System.IO.PathInternal:GetCommonPathLength (string,string,bool)\n\tint System.IO.PathInternal:GetRootLength (System.ReadOnlySpan`1<char>)\n\tint System.IO.Stream:Read (System.Span`1<byte>)\n\tint System.IO.Stream:ReadAtLeast (System.Span`1<byte>,int,bool)\n\tint System.IO.Stream:ReadAtLeastCore (System.Span`1<byte>,int,bool)\n\tint System.IO.UnmanagedMemoryStream:Read (byte[],int,int)\n\tint System.IO.UnmanagedMemoryStream:Read (System.Span`1<byte>)\n\tint System.IO.UnmanagedMemoryStream:ReadCore (System.Span`1<byte>)\n\tint System.Linq.Enumerable:Count (System.Collections.Generic.IEnumerable`1<System.Xml.Linq.XNode>)\n\tint System.Marvin:ComputeHash32 (byte&,uint,uint,uint)\n\tint System.Math:Min (int,int)\n\tint System.MulticastDelegate:GetHashCode ()\n\tint System.Nullable`1<System.Int32>:get_Value ()\n\tint System.Numerics.BitOperations:<PopCount>g__SoftwareFallback|25_0 (ulong)\n\tint System.Numerics.BitOperations:Log2SoftwareFallback (uint)\n\tint System.Object:GetHashCode ()\n\tint System.Private.CoreLib.Interop/Globalization:LoadICU ()\n\tint System.Private.CoreLib.Interop/Sys:<LowLevelMonitor_TimedWait>g____PInvoke|67_0 (intptr,int)\n\tint System.Private.CoreLib.Interop/Sys:<LStat>g____PInvoke|118_0 (byte*,Interop/Sys/FileStatus*)\n\tint System.Private.CoreLib.Interop/Sys:CanGetHiddenFlag ()\n\tint System.Private.CoreLib.Interop/Sys:GetErrNo ()\n\tint System.Private.CoreLib.Interop/Sys:LChflagsCanSetHiddenFlag ()\n\tint System.Private.CoreLib.Interop/Sys:LStat (byte&,Interop/Sys/FileStatus&)\n\tint System.Private.CoreLib.Interop/Sys:LStat (System.ReadOnlySpan`1<char>,Interop/Sys/FileStatus&)\n\tint System.Random/XoshiroImpl:Next (int,int)\n\tint System.Reflection.Assembly:GetHashCode ()\n\tint System.Reflection.Emit.DynamicMethod:AddRef (object)\n\tint System.Reflection.Emit.DynamicMethodTokenGenerator:GetToken (System.Reflection.MemberInfo,bool)\n\tint System.Reflection.Emit.ILExceptionInfo:LastClauseType ()\n\tint System.Reflection.Emit.ILGenerator:get_ILOffset ()\n\tint System.Reflection.Emit.Int32Stack:Pop ()\n\tint System.Reflection.MemberInfo:GetHashCode ()\n\tint System.Reflection.MethodBase:GetHashCode ()\n\tint System.Reflection.MethodInfo:GetHashCode ()\n\tint System.Reflection.MonoMethodInfo:get_method_attributes (intptr)\n\tint System.Reflection.RuntimeConstructorInfo:GetParametersCount ()\n\tint System.Reflection.RuntimeMethodInfo:GetParametersCount ()\n\tint System.Runtime.CompilerServices.RuntimeHelpers:GetHashCode (object)\n\tint System.Runtime.CompilerServices.RuntimeHelpers:InternalGetHashCode (object)\n\tint System.Runtime.InteropServices.Marshal:GetLastPInvokeError ()\n\tint System.Runtime.InteropServices.Marshal:GetLastSystemError ()\n\tint System.Runtime.InteropServices.Marshal:GetLastWin32Error ()\n\tint System.RuntimeType:GetArrayRank ()\n\tint System.RuntimeType:GetHashCode ()\n\tint System.RuntimeTypeHandle:GetArrayRank (System.Runtime.CompilerServices.QCallTypeHandle)\n\tint System.RuntimeTypeHandle:GetArrayRank (System.RuntimeType)\n\tint System.SpanHelpers:IndexOf (char&,int,char&,int)\n\tint System.SpanHelpers:IndexOfAnyChar (char&,char,char,int)\n\tint System.SpanHelpers:IndexOfAnyValueType (int16&,int16,int16,int16,int16,int16,int)\n\tint System.SpanHelpers:IndexOfChar (char&,char,int)\n\tint System.SpanHelpers:IndexOfNullByte (byte&)\n\tint System.SpanHelpers:IndexOfNullCharacter (char&)\n\tint System.SpanHelpers:IndexOfValueType (byte&,byte,int)\n\tint System.SpanHelpers:IndexOfValueType (long&,long,int)\n\tint System.SpanHelpers:LastIndexOfValueType (char&,char,int)\n\tint System.SpanHelpers:SequenceCompareTo (char&,int,char&,int)\n\tint System.String:Compare (string,int,string,int,int,System.StringComparison)\n\tint System.String:Compare (string,string,System.StringComparison)\n\tint System.String:CompareOrdinal (string,int,string,int,int)\n\tint System.String:GetHashCode ()\n\tint System.String:GetNonRandomizedHashCode ()\n\tint System.String:GetNonRandomizedHashCodeOrdinalIgnoreCase ()\n\tint System.String:IndexOf (char,System.StringComparison)\n\tint System.String:IndexOf (char)\n\tint System.String:IndexOf (string,int,int,System.StringComparison)\n\tint System.String:IndexOf (string,System.StringComparison)\n\tint System.String:IndexOfAny (char[],int,int)\n\tint System.String:IndexOfAny (char[])\n\tint System.String:LastIndexOf (char)\n\tint System.String:strlen (byte*)\n\tint System.String:wcslen (char*)\n\tint System.Text.DecoderExceptionFallbackBuffer:get_Remaining ()\n\tint System.Text.EncoderReplacementFallback:get_MaxCharCount ()\n\tint System.Text.Encoding:get_CodePage ()\n\tint System.Text.Encoding:GetChars (byte*,int,char*,int,System.Text.DecoderNLS)\n\tint System.Text.Encoding:GetCharsWithFallback (byte*,int,char*,int,int,int,System.Text.DecoderNLS)\n\tint System.Text.Encoding:GetCharsWithFallback (System.ReadOnlySpan`1<byte>,int,System.Span`1<char>,int,System.Text.DecoderNLS)\n\tint System.Text.Encodings.Web.DefaultJavaScriptEncoder:FindFirstCharacterToEncode (char*,int)\n\tint System.Text.Encodings.Web.DefaultJavaScriptEncoder:FindFirstCharacterToEncodeUtf8 (System.ReadOnlySpan`1<byte>)\n\tint System.Text.Encodings.Web.DefaultJavaScriptEncoder/EscaperImplementation:<EncodeUtf16>g__TryEncodeScalarAsHex|5_0 (object,System.Text.Rune,System.Span`1<char>)\n\tint System.Text.Encodings.Web.DefaultJavaScriptEncoder/EscaperImplementation:EncodeUtf16 (System.Text.Rune,System.Span`1<char>)\n\tint System.Text.Encodings.Web.OptimizedInboxTextEncoder:GetIndexOfFirstByteToEncode (System.ReadOnlySpan`1<byte>)\n\tint System.Text.Encodings.Web.OptimizedInboxTextEncoder:GetIndexOfFirstCharToEncode (System.ReadOnlySpan`1<char>)\n\tint System.Text.Json.JsonReaderHelper:GetUtf8ByteCount (System.ReadOnlySpan`1<char>)\n\tint System.Text.Json.JsonReaderHelper:GetUtf8FromText (System.ReadOnlySpan`1<char>,System.Span`1<byte>)\n\tint System.Text.Json.JsonReaderHelper:IndexOfOrLessThan (byte&,byte,byte,byte,int)\n\tint System.Text.Json.JsonSerializerOptions/EqualityComparer:GetHashCode (System.Text.Json.JsonSerializerOptions)\n\tint System.Text.Json.JsonWriterHelper:NeedsEscaping (System.ReadOnlySpan`1<byte>,System.Text.Encodings.Web.JavaScriptEncoder)\n\tint System.Text.Json.JsonWriterHelper:NeedsEscaping (System.ReadOnlySpan`1<char>,System.Text.Encodings.Web.JavaScriptEncoder)\n\tint System.Text.Json.Serialization.ConfigurationList`1<System.Text.Json.Serialization.JsonConverter>:get_Count ()\n\tint System.Text.UTF8Encoding:GetByteCount (System.ReadOnlySpan`1<char>)\n\tint System.Text.UTF8Encoding:GetByteCountFast (char*,int,System.Text.EncoderFallback,int&)\n\tint System.Text.UTF8Encoding:GetBytes (System.ReadOnlySpan`1<char>,System.Span`1<byte>)\n\tint System.Text.UTF8Encoding:GetBytesFast (char*,int,byte*,int,int&)\n\tint System.Text.UTF8Encoding:GetCharCount (byte*,int)\n\tint System.Text.UTF8Encoding:GetCharCountFast (byte*,int,System.Text.DecoderFallback,int&)\n\tint System.Text.UTF8Encoding:GetChars (byte*,int,char*,int)\n\tint System.Text.UTF8Encoding:GetCharsFast (byte*,int,char*,int,int&)\n\tint System.Text.UTF8Encoding:GetCharsWithFallback (System.ReadOnlySpan`1<byte>,int,System.Span`1<char>,int,System.Text.DecoderNLS)\n\tint System.Text.UTF8Encoding/UTF8EncodingSealed:GetMaxByteCount (int)\n\tint System.Threading.LowLevelLifoSemaphore:TimedWaitInternal (intptr,int)\n\tint System.Threading.PortableThreadPool/GateThread:GetRunningStateForNumRuns (int)\n\tint System.Threading.ThreadLocal`1/IdManager<Java.Interop.JniEnvironmentInfo>:GetId (bool)\n\tint System.Threading.ThreadLocal`1<Java.Interop.JniEnvironmentInfo>:GetNewTableSize (int)\n\tint System.Threading.WaitHandle:WaitOneCore (intptr,int)\n\tint System.Threading.WaitSubsystem:Wait (intptr,int,bool)\n\tint System.Threading.WaitSubsystem:Wait (System.Threading.WaitSubsystem/WaitableObject,int,bool,bool)\n\tint System.Threading.WaitSubsystem/ThreadWaitInfo:ProcessSignaledWaitState ()\n\tint System.Threading.WaitSubsystem/ThreadWaitInfo:Wait (int,bool,bool,System.Threading.WaitSubsystem/LockHolder&)\n\tint System.Threading.WaitSubsystem/WaitableObject:Wait (System.Threading.WaitSubsystem/ThreadWaitInfo,int,bool,bool)\n\tint System.Threading.WaitSubsystem/WaitableObject:Wait_Locked (System.Threading.WaitSubsystem/ThreadWaitInfo,int,bool,bool,System.Threading.WaitSubsystem/LockHolder&)\n\tint System.Uri:CheckAuthorityHelper (char*,int,int,System.ParsingError&,System.Uri/Flags&,System.UriParser,string&)\n\tint System.Uri:get_Port ()\n\tint System.Uri:ParseSchemeCheckImplicitFile (char*,int,System.ParsingError&,System.Uri/Flags&,System.UriParser&)\n\tint System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>:GetHashCode ()\n\tint System.Xml.Linq.XHashtable`1/XHashtableState<System.Xml.Linq.XName>:ComputeHashCode (string,int,int)\n\tint System.Xml.Linq.XNamespace:GetHashCode ()\n\tint System.Xml.ValidateNames:ParseNCName (string,int)\n\tint System.Xml.XmlReader:CalcBufferSize (System.IO.Stream)\n\tint System.Xml.XmlTextReaderImpl:EatWhitespaces (System.Text.StringBuilder)\n\tint System.Xml.XmlTextReaderImpl:GetChars (int)\n\tint System.Xml.XmlTextReaderImpl:GetIndexOfAttributeWithoutPrefix (string)\n\tint System.Xml.XmlTextReaderImpl:ParseName ()\n\tint System.Xml.XmlTextReaderImpl:ParseQName (bool,int,int&)\n\tint System.Xml.XmlTextReaderImpl:ParseQName (int&)\n\tint System.Xml.XmlTextReaderImpl:ReadData ()\n\tint& System.Collections.Generic.Dictionary`2<System.String, System.Int32>:FindValue (string)\n\tint16 System.AppContextConfigHelper:GetInt16Config (string,int16,bool)\n\tint16 System.DateTimeOffset:ValidateOffset (System.TimeSpan)\n\tint16 System.Threading.PortableThreadPool:get_MinThreadsGoal ()\n\tint16 System.Threading.PortableThreadPool:get_TargetThreadsGoalForBlockingAdjustment ()\n\tInterop/Error System.Private.CoreLib.Interop/Sys:ConvertErrorPlatformToPal (int)\n\tInterop/ErrorInfo System.Private.CoreLib.Interop/Sys:GetLastErrorInfo ()\n\tInterop/Globalization/ResultCode System.Private.CoreLib.Interop/Globalization:<GetSortHandle>g____PInvoke|10_0 (byte*,intptr*)\n\tInterop/Globalization/ResultCode System.Private.CoreLib.Interop/Globalization:GetSortHandle (string,intptr&)\n\tintptr Android.Runtime.InputStreamAdapter:ToLocalJniHandle (System.IO.Stream)\n\tintptr Android.Runtime.JavaDictionary`2/<>c__DisplayClass4_0<System.String, System.String>:<Put>b__0 (intptr)\n\tintptr Android.Runtime.JavaDictionary`2/<>c__DisplayClass4_1<System.String, System.String>:<Put>b__1 (intptr)\n\tintptr Android.Runtime.JavaDictionary`2<System.String, System.String>:ToLocalJniHandle (System.Collections.Generic.IDictionary`2<string, string>)\n\tintptr Android.Runtime.JNIEnv:_monodroid_get_identity_hash_code (intptr,intptr)\n\tintptr Android.Runtime.JNIEnv:AllocObject (intptr)\n\tintptr Android.Runtime.JNIEnv:AllocObject (string)\n\tintptr Android.Runtime.JNIEnv:BinaryName (string)\n\tintptr Android.Runtime.JNIEnv:CallObjectMethod (intptr,intptr,Android.Runtime.JValue[])\n\tintptr Android.Runtime.JNIEnv:CallObjectMethod (intptr,intptr,Android.Runtime.JValue*)\n\tintptr Android.Runtime.JNIEnv:CallObjectMethod (intptr,intptr)\n\tintptr Android.Runtime.JNIEnv:FindClass (string)\n\tintptr Android.Runtime.JNIEnv:FindClass (System.Type)\n\tintptr Android.Runtime.JNIEnv:get_Handle ()\n\tintptr Android.Runtime.JNIEnv:GetMethodID (intptr,string,string)\n\tintptr Android.Runtime.JNIEnv:GetObjectArrayElement (intptr,int)\n\tintptr Android.Runtime.JNIEnv:GetObjectClass (intptr)\n\tintptr Android.Runtime.JNIEnv:GetSuperclass (intptr)\n\tintptr Android.Runtime.JNIEnv:monodroid_typemap_managed_to_java (System.Type,byte*)\n\tintptr Android.Runtime.JNIEnv:NewArray (Android.Runtime.IJavaObject[])\n\tintptr Android.Runtime.JNIEnv:NewArray (Android.Webkit.WebMessagePort[])\n\tintptr Android.Runtime.JNIEnv:NewGlobalRef (intptr)\n\tintptr Android.Runtime.JNIEnv:NewLocalRef (intptr)\n\tintptr Android.Runtime.JNIEnv:NewObjectArray (int,intptr,intptr)\n\tintptr Android.Runtime.JNIEnv:NewString (char[],int)\n\tintptr Android.Runtime.JNIEnv:NewString (string)\n\tintptr Android.Runtime.JNIEnv:StartCreateInstance (string,string,Android.Runtime.JValue[])\n\tintptr Android.Runtime.JNIEnv:StartCreateInstance (string,string,Android.Runtime.JValue*)\n\tintptr Android.Runtime.JNIEnv:ToLocalJniHandle (Android.Runtime.IJavaObject)\n\tintptr Android.Runtime.JNIEnv/<>c:<CreateCreateManagedToNativeArray>b__157_9 (System.Array)\n\tintptr Android.Runtime.JNIEnv/<>c:<Initialize>b__29_0 (intptr)\n\tintptr Android.Runtime.JNINativeWrapper:Wrap_JniMarshal_PPLL_L (_JniMarshal_PPLL_L,intptr,intptr,intptr,intptr)\n\tintptr Android.Webkit.IWebResourceRequestInvoker:get_java_class_ref ()\n\tintptr Android.Webkit.IWebResourceRequestInvoker:Validate (intptr)\n\tintptr Android.Webkit.WebViewClient:n_ShouldInterceptRequest_Landroid_webkit_WebView_Landroid_webkit_WebResourceRequest_ (intptr,intptr,intptr,intptr)\n\tintptr Java.Interop.JavaConvert:ToLocalJniHandle (object)\n\tintptr Java.Interop.JavaConvert:WithLocalJniHandle (string,System.Func`2<intptr, intptr>)\n\tintptr Java.Interop.JavaConvert/<>c:<.cctor>b__20_29 (object)\n\tintptr Java.Interop.JniRuntime:_AttachCurrentThread (string,Java.Interop.JniObjectReference)\n\tintptr Java.Interop.JniRuntime:get_InvocationPointer ()\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_alloc_object (intptr,intptr&,intptr)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_call_nonvirtual_object_method_a (intptr,intptr&,intptr,intptr,intptr,intptr)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_call_object_method (intptr,intptr&,intptr,intptr)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_call_object_method_a (intptr,intptr&,intptr,intptr,intptr)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_call_static_object_method_a (intptr,intptr&,intptr,intptr,intptr)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_find_class (intptr,intptr&,string)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_get_field_id (intptr,intptr&,intptr,string,string)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_get_method_id (intptr,intptr&,intptr,string,string)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_get_object_array_element (intptr,intptr&,intptr,int)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_get_object_class (intptr,intptr)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_get_static_method_id (intptr,intptr&,intptr,string,string)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_get_superclass (intptr,intptr)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_new_global_ref (intptr,intptr)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_new_local_ref (intptr,intptr)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_new_object_array (intptr,intptr&,int,intptr,intptr)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_new_string (intptr,intptr&,char*,int)\n\tintptr Java.Interop.TypeManager:monodroid_TypeManager_get_java_class_name (intptr)\n\tintptr Java.Lang.Object:get_Handle ()\n\tintptr Java.Lang.Object:Java.Interop.IJavaObjectEx.ToLocalJniHandle ()\n\tintptr Mono.RuntimeGPtrArrayHandle:get_Item (int)\n\tintptr Mono.RuntimeGPtrArrayHandle:Lookup (int)\n\tintptr Mono.SafeGPtrArrayHandle:get_Item (int)\n\tintptr Mono.SafeStringMarshal:get_Value ()\n\tintptr Mono.SafeStringMarshal:StringToUtf8 (string)\n\tintptr Mono.SafeStringMarshal:StringToUtf8_icall (string&)\n\tintptr System.Array:GetFlattenedIndex (int)\n\tintptr System.Globalization.CompareInfo/SortHandleCache:GetCachedSortHandle (string)\n\tintptr System.Private.CoreLib.Interop/Sys:<GetEnv>g____PInvoke|0_0 (byte*)\n\tintptr System.Private.CoreLib.Interop/Sys:GetEnv (string)\n\tintptr System.Private.CoreLib.Interop/Sys:LowLevelMonitor_Create ()\n\tintptr System.Reflection.RuntimeAssembly:GetManifestResourceInternal (System.Runtime.CompilerServices.QCallAssembly,string,int&,System.Runtime.CompilerServices.ObjectHandleOnStack)\n\tintptr System.Runtime.InteropServices.GCHandle:InternalAlloc (object,System.Runtime.InteropServices.GCHandleType)\n\tintptr System.Runtime.InteropServices.Marshal:ReadIntPtr (intptr,int)\n\tintptr System.Runtime.InteropServices.Marshal:ReadIntPtr (intptr)\n\tintptr System.RuntimeType:GetConstructors_native (System.Runtime.CompilerServices.QCallTypeHandle,System.Reflection.BindingFlags)\n\tintptr System.RuntimeType:GetFields_native (System.Runtime.CompilerServices.QCallTypeHandle,intptr,System.Reflection.BindingFlags,System.RuntimeType/MemberListType)\n\tintptr System.RuntimeType:GetMethodsByName_native (System.Runtime.CompilerServices.QCallTypeHandle,intptr,System.Reflection.BindingFlags,System.RuntimeType/MemberListType)\n\tintptr System.RuntimeType:GetPropertiesByName_native (System.Runtime.CompilerServices.QCallTypeHandle,intptr,System.Reflection.BindingFlags,System.RuntimeType/MemberListType)\n\tintptr System.Threading.LowLevelLifoSemaphore:InitInternal ()\n\tintptr System.Threading.WaitSubsystem/HandleManager:NewHandle (System.Threading.WaitSubsystem/WaitableObject)\n\tintptr& System.Collections.Generic.Dictionary`2<System.String, System.IntPtr>:FindValue (string)\n\tJava.Interop.IJavaPeerable Android.Runtime.AndroidValueManager:PeekPeer (Java.Interop.JniObjectReference)\n\tJava.Interop.IJavaPeerable Java.Interop.TypeManager:CreateInstance (intptr,Android.Runtime.JniHandleOwnership,System.Type)\n\tJava.Interop.IJavaPeerable Java.Interop.TypeManager:CreateInstance (intptr,Android.Runtime.JniHandleOwnership)\n\tJava.Interop.IJavaPeerable Java.Lang.Object:GetObject (intptr,Android.Runtime.JniHandleOwnership,System.Type)\n\tJava.Interop.IJavaPeerable Java.Lang.Object:PeekObject (intptr,System.Type)\n\tJava.Interop.IJavaPeerable System.WeakReference`1<Java.Interop.IJavaPeerable>:get_Target ()\n\tJava.Interop.JavaVMInterface Java.Interop.JniRuntime:CreateInvoker (intptr)\n\tJava.Interop.JniEnvironmentInfo Java.Interop.JniEnvironment/<>c:<.cctor>b__35_0 ()\n\tJava.Interop.JniEnvironmentInfo System.Threading.ThreadLocal`1<Java.Interop.JniEnvironmentInfo>:get_Value ()\n\tJava.Interop.JniEnvironmentInfo System.Threading.ThreadLocal`1<Java.Interop.JniEnvironmentInfo>:GetValueSlow ()\n\tJava.Interop.JniFieldInfo Java.Interop.JniEnvironment/InstanceFields:GetFieldID (Java.Interop.JniObjectReference,string,string)\n\tJava.Interop.JniFieldInfo Java.Interop.JniPeerMembers/JniInstanceFields:GetFieldInfo (string)\n\tJava.Interop.JniFieldInfo Java.Interop.JniType:GetInstanceField (string,string)\n\tJava.Interop.JniMethodInfo Java.Interop.JniEnvironment/InstanceMethods:GetMethodID (Java.Interop.JniObjectReference,string,string)\n\tJava.Interop.JniMethodInfo Java.Interop.JniPeerMembers/JniInstanceMethods:GetConstructor (string)\n\tJava.Interop.JniMethodInfo Java.Interop.JniPeerMembers/JniInstanceMethods:GetMethodInfo (string,string)\n\tJava.Interop.JniMethodInfo Java.Interop.JniPeerMembers/JniInstanceMethods:GetMethodInfo (string)\n\tJava.Interop.JniMethodInfo Java.Interop.JniPeerMembers/JniStaticMethods:GetMethodInfo (string,string)\n\tJava.Interop.JniMethodInfo Java.Interop.JniPeerMembers/JniStaticMethods:GetMethodInfo (string)\n\tJava.Interop.JniMethodInfo Java.Interop.JniType:GetConstructor (string)\n\tJava.Interop.JniMethodInfo Java.Interop.JniType:GetInstanceMethod (string,string)\n\tJava.Interop.JniObjectReference Android.Runtime.AndroidObjectReferenceManager:CreateGlobalReference (Java.Interop.JniObjectReference)\n\tJava.Interop.JniObjectReference Android.Runtime.AndroidObjectReferenceManager:CreateLocalReference (Java.Interop.JniObjectReference,int&)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/Arrays:GetObjectArrayElement (Java.Interop.JniObjectReference,int)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/Arrays:NewObjectArray (int,Java.Interop.JniObjectReference,Java.Interop.JniObjectReference)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/InstanceMethods:CallNonvirtualObjectMethod (Java.Interop.JniObjectReference,Java.Interop.JniObjectReference,Java.Interop.JniMethodInfo,Java.Interop.JniArgumentValue*)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/InstanceMethods:CallObjectMethod (Java.Interop.JniObjectReference,Java.Interop.JniMethodInfo,Java.Interop.JniArgumentValue*)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/InstanceMethods:CallObjectMethod (Java.Interop.JniObjectReference,Java.Interop.JniMethodInfo)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/Object:AllocObject (Java.Interop.JniObjectReference)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/Object:ToString (Java.Interop.JniObjectReference)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/References:NewGlobalRef (Java.Interop.JniObjectReference)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/References:NewLocalRef (Java.Interop.JniObjectReference)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/StaticMethods:CallStaticObjectMethod (Java.Interop.JniObjectReference,Java.Interop.JniMethodInfo,Java.Interop.JniArgumentValue*)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/Strings:NewString (char*,int)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/Strings:NewString (string)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/Types:FindClass (string)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/Types:GetObjectClass (Java.Interop.JniObjectReference)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/Types:GetSuperclass (Java.Interop.JniObjectReference)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/Types:TryFindClass (string,bool)\n\tJava.Interop.JniObjectReference Java.Interop.JniObjectReference:NewGlobalRef ()\n\tJava.Interop.JniObjectReference Java.Interop.JniObjectReference:NewLocalRef ()\n\tJava.Interop.JniObjectReference Java.Interop.JniPeerMembers/JniInstanceMethods:InvokeAbstractObjectMethod (string,Java.Interop.IJavaPeerable,Java.Interop.JniArgumentValue*)\n\tJava.Interop.JniObjectReference Java.Interop.JniPeerMembers/JniInstanceMethods:InvokeNonvirtualObjectMethod (string,Java.Interop.IJavaPeerable,Java.Interop.JniArgumentValue*)\n\tJava.Interop.JniObjectReference Java.Interop.JniPeerMembers/JniInstanceMethods:InvokeVirtualObjectMethod (string,Java.Interop.IJavaPeerable,Java.Interop.JniArgumentValue*)\n\tJava.Interop.JniObjectReference Java.Interop.JniPeerMembers/JniInstanceMethods:StartCreateInstance (string,System.Type,Java.Interop.JniArgumentValue*)\n\tJava.Interop.JniObjectReference Java.Interop.JniPeerMembers/JniStaticMethods:InvokeObjectMethod (string,Java.Interop.JniArgumentValue*)\n\tJava.Interop.JniObjectReference Java.Interop.JniRuntime/JniObjectReferenceManager:CreateGlobalReference (Java.Interop.JniObjectReference)\n\tJava.Interop.JniObjectReference Java.Interop.JniRuntime/JniObjectReferenceManager:CreateLocalReference (Java.Interop.JniEnvironmentInfo,Java.Interop.JniObjectReference)\n\tJava.Interop.JniObjectReference Java.Interop.JniRuntime/JniObjectReferenceManager:CreateLocalReference (Java.Interop.JniObjectReference,int&)\n\tJava.Interop.JniObjectReference Java.Interop.JniType:AllocObject ()\n\tJava.Interop.JniObjectReference Java.Lang.Object:get_PeerReference ()\n\tJava.Interop.JniObjectReference Java.Lang.Throwable:get_PeerReference ()\n\tJava.Interop.JniPeerMembers Android.Runtime.XAPeerMembers:GetPeerMembers (Java.Interop.IJavaPeerable)\n\tJava.Interop.JniPeerMembers Android.Webkit.WebViewClient:get_JniPeerMembers ()\n\tJava.Interop.JniPeerMembers AndroidX.AppCompat.App.AppCompatActivity:get_JniPeerMembers ()\n\tJava.Interop.JniPeerMembers Java.Interop.JniPeerMembers:GetPeerMembers (Java.Interop.IJavaPeerable)\n\tJava.Interop.JniPeerMembers Java.Lang.Class:get_Members ()\n\tJava.Interop.JniPeerMembers/JniInstanceFields Java.Interop.JniPeerMembers:get_InstanceFields ()\n\tJava.Interop.JniPeerMembers/JniInstanceMethods Java.Interop.JniPeerMembers:Assert (Java.Interop.JniPeerMembers/JniInstanceMethods)\n\tJava.Interop.JniPeerMembers/JniInstanceMethods Java.Interop.JniPeerMembers:get_InstanceMethods ()\n\tJava.Interop.JniPeerMembers/JniInstanceMethods Java.Interop.JniPeerMembers/JniInstanceMethods:GetConstructorsForType (System.Type)\n\tJava.Interop.JniPeerMembers/JniStaticMethods Java.Interop.JniPeerMembers:get_StaticMethods ()\n\tJava.Interop.JniRuntime Java.Interop.JniRuntime:get_CurrentRuntime ()\n\tJava.Interop.JniRuntime Java.Interop.JniRuntime:GetRegisteredRuntime (intptr)\n\tJava.Interop.JniRuntime/JniValueManager Java.Interop.JniRuntime:get_ValueManager ()\n\tJava.Interop.JniRuntime/JniValueManager Java.Interop.JniRuntime:SetRuntime (Java.Interop.JniRuntime/JniValueManager)\n\tJava.Interop.JniRuntime& System.Collections.Generic.Dictionary`2<System.IntPtr, Java.Interop.JniRuntime>:FindValue (intptr)\n\tJava.Interop.JniType Java.Interop.JniPeerMembers:get_JniPeerType ()\n\tJava.Interop.JniType Java.Interop.JniPeerMembers/JniInstanceMethods:get_JniPeerType ()\n\tJava.Interop.JniType Java.Interop.JniType:GetCachedJniType (Java.Interop.JniType&,string)\n\tJava.Interop.JniTypeSignature Java.Interop.JniRuntime/JniTypeManager:GetTypeSignature (System.Type)\n\tlong Microsoft.AspNetCore.Components.WebView.ArrayBuilderMemoryStream:get_Position ()\n\tlong Microsoft.JSInterop.JSRuntime:TrackObjectReference (Microsoft.JSInterop.DotNetObjectReference`1<Microsoft.AspNetCore.Components.RenderTree.WebRenderer/WebRendererInteropMethods>)\n\tlong System.BitConverter:DoubleToInt64Bits (double)\n\tlong System.Diagnostics.Stopwatch:GetTimestamp ()\n\tlong System.Diagnostics.Stopwatch:QueryPerformanceCounter ()\n\tlong System.IO.UnmanagedMemoryStream:get_Length ()\n\tlong System.IPv4AddressHelper:ParseNonCanonical (char*,int,int&,bool)\n\tlong System.Private.CoreLib.Interop/Sys:GetSystemTimeAsTicks ()\n\tlong System.Runtime.InteropServices.Marshal:ReadInt64 (intptr,int)\n\tlong System.Text.Json.JsonElement:GetInt64 ()\n\tlong System.Text.Json.Utf8JsonReader:GetInt64 ()\n\tlong System.Threading.ThreadInt64PersistentCounter:get_Count ()\n\tMicrosoft.AspNetCore.Components.CascadingParameterAttribute System.Reflection.CustomAttributeExtensions:GetCustomAttribute (System.Reflection.MemberInfo)\n\tMicrosoft.AspNetCore.Components.CascadingParameterState/ReflectedCascadingParameterInfo[] Microsoft.AspNetCore.Components.CascadingParameterState:CreateReflectedCascadingParameterInfos (System.Type)\n\tMicrosoft.AspNetCore.Components.CascadingParameterState/ReflectedCascadingParameterInfo[] Microsoft.AspNetCore.Components.CascadingParameterState:GetReflectedCascadingParameterInfos (System.Type)\n\tMicrosoft.AspNetCore.Components.Dispatcher Microsoft.AspNetCore.Components.WebView.Services.WebViewRenderer:get_Dispatcher ()\n\tMicrosoft.AspNetCore.Components.EventCallback`1<Microsoft.AspNetCore.Components.Web.MouseEventArgs> Microsoft.AspNetCore.Components.EventCallbackFactory:Create (object,System.Action)\n\tMicrosoft.AspNetCore.Components.EventCallback`1<Microsoft.AspNetCore.Components.Web.MouseEventArgs> Microsoft.AspNetCore.Components.EventCallbackFactory:CreateCore (object,System.MulticastDelegate)\n\tMicrosoft.AspNetCore.Components.IComponent Microsoft.AspNetCore.Components.ComponentFactory:InstantiateComponent (System.IServiceProvider,System.Type)\n\tMicrosoft.AspNetCore.Components.IComponent Microsoft.AspNetCore.Components.DefaultComponentActivator:CreateInstance (System.Type)\n\tMicrosoft.AspNetCore.Components.IComponent Microsoft.AspNetCore.Components.RenderTree.Renderer:InstantiateComponent (System.Type)\n\tMicrosoft.AspNetCore.Components.IComponentActivator Microsoft.AspNetCore.Components.DefaultComponentActivator:get_Instance ()\n\tMicrosoft.AspNetCore.Components.IComponentActivator Microsoft.AspNetCore.Components.RenderTree.Renderer:GetComponentActivatorOrDefault (System.IServiceProvider)\n\tMicrosoft.AspNetCore.Components.IComponentActivator Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions:GetService (System.IServiceProvider)\n\tMicrosoft.AspNetCore.Components.ParameterValue Microsoft.AspNetCore.Components.ParameterView/Enumerator:get_Current ()\n\tMicrosoft.AspNetCore.Components.ParameterView Microsoft.AspNetCore.Components.ParameterView:get_Empty ()\n\tMicrosoft.AspNetCore.Components.ParameterView/Enumerator Microsoft.AspNetCore.Components.ParameterView:GetEnumerator ()\n\tMicrosoft.AspNetCore.Components.RenderFragment Microsoft.AspNetCore.Components.LayoutView:WrapInLayout (System.Type,Microsoft.AspNetCore.Components.RenderFragment)\n\tMicrosoft.AspNetCore.Components.Rendering.ComponentState Microsoft.AspNetCore.Components.RenderTree.Renderer:AttachAndInitComponent (Microsoft.AspNetCore.Components.IComponent,int)\n\tMicrosoft.AspNetCore.Components.Rendering.ComponentState Microsoft.AspNetCore.Components.RenderTree.Renderer:GetOptionalComponentState (int)\n\tMicrosoft.AspNetCore.Components.Rendering.ComponentState Microsoft.AspNetCore.Components.RenderTree.Renderer:GetRequiredComponentState (int)\n\tMicrosoft.AspNetCore.Components.Rendering.ComponentState Microsoft.AspNetCore.Components.RenderTree.Renderer:GetRequiredRootComponentState (int)\n\tMicrosoft.AspNetCore.Components.Rendering.ComponentState& System.Collections.Generic.Dictionary`2<System.Int32, Microsoft.AspNetCore.Components.Rendering.ComponentState>:FindValue (int)\n\tMicrosoft.AspNetCore.Components.Rendering.RenderQueueEntry System.Collections.Generic.Queue`1<Microsoft.AspNetCore.Components.Rendering.RenderQueueEntry>:Dequeue ()\n\tMicrosoft.AspNetCore.Components.RenderTree.ArrayBuilderSegment`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit> Microsoft.AspNetCore.Components.RenderTree.ArrayBuilderExtensions:ToSegment (Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit>,int,int)\n\tMicrosoft.AspNetCore.Components.RenderTree.RenderBatch Microsoft.AspNetCore.Components.Rendering.RenderBatchBuilder:ToBatch ()\n\tMicrosoft.AspNetCore.Components.RenderTree.RenderTreeDiff Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder:ComputeDiff (Microsoft.AspNetCore.Components.RenderTree.Renderer,Microsoft.AspNetCore.Components.Rendering.RenderBatchBuilder,int,Microsoft.AspNetCore.Components.RenderTree.ArrayRange`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>,Microsoft.AspNetCore.Components.RenderTree.ArrayRange`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>)\n\tMicrosoft.AspNetCore.Components.RenderTree.RenderTreeDiff[] System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff>:Rent (int)\n\tMicrosoft.AspNetCore.Components.RenderTree.RenderTreeDiff[] System.GC:AllocateArray (int,bool)\n\tMicrosoft.AspNetCore.Components.RenderTree.RenderTreeDiff[] System.GC:AllocateUninitializedArray (int,bool)\n\tMicrosoft.AspNetCore.Components.RenderTree.RenderTreeEdit Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit:PrependFrame (int,int)\n\tMicrosoft.AspNetCore.Components.RenderTree.RenderTreeEdit[] Microsoft.AspNetCore.Components.RenderTree.ArrayBuilderSegment`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit>:get_Array ()\n\tMicrosoft.AspNetCore.Components.RenderTree.RenderTreeEdit[] System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit>:Rent (int)\n\tMicrosoft.AspNetCore.Components.RenderTree.RenderTreeEdit[] System.GC:AllocateArray (int,bool)\n\tMicrosoft.AspNetCore.Components.RenderTree.RenderTreeEdit[] System.GC:AllocateUninitializedArray (int,bool)\n\tMicrosoft.AspNetCore.Components.RenderTree.RenderTreeFrame Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame:Element (int,string)\n\tMicrosoft.AspNetCore.Components.RenderTree.RenderTreeFrame Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame:WithComponentSubtreeLength (int)\n\tMicrosoft.AspNetCore.Components.RenderTree.RenderTreeFrame[] System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>:Rent (int)\n\tMicrosoft.AspNetCore.Components.RenderTree.RenderTreeFrame[] System.GC:AllocateArray (int,bool)\n\tMicrosoft.AspNetCore.Components.RenderTree.RenderTreeFrame[] System.GC:AllocateUninitializedArray (int,bool)\n\tMicrosoft.AspNetCore.Components.Routing.QueryParameterValueSupplier Microsoft.AspNetCore.Components.Routing.QueryParameterValueSupplier:ForType (System.Type)\n\tMicrosoft.AspNetCore.Components.Routing.QueryParameterValueSupplier/QueryParameterMapping[] Microsoft.AspNetCore.Components.Routing.QueryParameterValueSupplier:GetSortedMappings (System.Type)\n\tMicrosoft.AspNetCore.Components.Routing.RouteTable Microsoft.AspNetCore.Components.RouteTableFactory:Create (Microsoft.AspNetCore.Components.Routing.RouteKey)\n\tMicrosoft.AspNetCore.Components.Routing.RouteTable Microsoft.AspNetCore.Components.RouteTableFactory:Create (System.Collections.Generic.Dictionary`2<System.Type, string[]>)\n\tMicrosoft.AspNetCore.Components.Routing.RouteTable Microsoft.AspNetCore.Components.RouteTableFactory:Create (System.Collections.Generic.List`1<System.Type>)\n\tMicrosoft.AspNetCore.Components.Routing.RouteTemplate Microsoft.AspNetCore.Components.Routing.TemplateParser:ParseTemplate (string)\n\tMicrosoft.AspNetCore.Components.WebView.Services.WebViewRenderer/UnacknowledgedRenderBatch System.Collections.Generic.Queue`1<Microsoft.AspNetCore.Components.WebView.Services.WebViewRenderer/UnacknowledgedRenderBatch>:Dequeue ()\n\tMicrosoft.Extensions.DependencyInjection.AsyncServiceScope Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions:CreateAsyncScope (System.IServiceProvider)\n\tMicrosoft.Extensions.DependencyInjection.IServiceCollection Microsoft.Extensions.DependencyInjection.ComponentsWebViewServiceCollectionExtensions:AddBlazorWebView (Microsoft.Extensions.DependencyInjection.IServiceCollection)\n\tMicrosoft.Extensions.DependencyInjection.IServiceCollection Microsoft.Extensions.DependencyInjection.LoggingServiceCollectionExtensions:AddLogging (Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action`1<Microsoft.Extensions.Logging.ILoggingBuilder>)\n\tMicrosoft.Extensions.DependencyInjection.IServiceCollection Microsoft.Extensions.DependencyInjection.LoggingServiceCollectionExtensions:AddLogging (Microsoft.Extensions.DependencyInjection.IServiceCollection)\n\tMicrosoft.Extensions.DependencyInjection.IServiceCollection Microsoft.Extensions.DependencyInjection.OptionsServiceCollectionExtensions:AddOptions (Microsoft.Extensions.DependencyInjection.IServiceCollection)\n\tMicrosoft.Extensions.DependencyInjection.IServiceScope Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope:CreateScope ()\n\tMicrosoft.Extensions.DependencyInjection.IServiceScope Microsoft.Extensions.DependencyInjection.ServiceProvider:CreateScope ()\n\tMicrosoft.Extensions.DependencyInjection.IServiceScope Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions:CreateScope (System.IServiceProvider)\n\tMicrosoft.Extensions.DependencyInjection.IServiceScopeFactory Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions:GetRequiredService (System.IServiceProvider)\n\tMicrosoft.Extensions.DependencyInjection.ServiceDescriptor Microsoft.Extensions.DependencyInjection.ServiceCollection:get_Item (int)\n\tMicrosoft.Extensions.DependencyInjection.ServiceDescriptor Microsoft.Extensions.DependencyInjection.ServiceDescriptor:Describe (Microsoft.Extensions.DependencyInjection.ServiceLifetime)\n\tMicrosoft.Extensions.DependencyInjection.ServiceDescriptor Microsoft.Extensions.DependencyInjection.ServiceDescriptor:Describe (System.Type,System.Type,Microsoft.Extensions.DependencyInjection.ServiceLifetime)\n\tMicrosoft.Extensions.DependencyInjection.ServiceDescriptor Microsoft.Extensions.DependencyInjection.ServiceDescriptor:Scoped (System.Type,System.Type)\n\tMicrosoft.Extensions.DependencyInjection.ServiceDescriptor Microsoft.Extensions.DependencyInjection.ServiceDescriptor:Singleton ()\n\tMicrosoft.Extensions.DependencyInjection.ServiceDescriptor Microsoft.Extensions.DependencyInjection.ServiceDescriptor:Singleton (Microsoft.Extensions.Options.IConfigureOptions`1<Microsoft.Extensions.Logging.LoggerFilterOptions>)\n\tMicrosoft.Extensions.DependencyInjection.ServiceDescriptor Microsoft.Extensions.DependencyInjection.ServiceDescriptor:Singleton (System.Type,object)\n\tMicrosoft.Extensions.DependencyInjection.ServiceDescriptor Microsoft.Extensions.DependencyInjection.ServiceDescriptor:Singleton (System.Type,System.Type)\n\tMicrosoft.Extensions.DependencyInjection.ServiceDescriptor Microsoft.Extensions.DependencyInjection.ServiceDescriptor:Transient (System.Type,System.Type)\n\tMicrosoft.Extensions.DependencyInjection.ServiceDescriptor Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory/ServiceDescriptorCacheItem:get_Last ()\n\tMicrosoft.Extensions.DependencyInjection.ServiceDescriptor System.Collections.Generic.List`1<Microsoft.Extensions.DependencyInjection.ServiceDescriptor>:get_Item (int)\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain/ChainItemInfo& System.Collections.Generic.Dictionary`2<System.Type, Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain/ChainItemInfo>:FindValue (System.Type)\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory Microsoft.Extensions.DependencyInjection.ServiceProvider:get_CallSiteFactory ()\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory/ServiceDescriptorCacheItem Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory/ServiceDescriptorCacheItem:Add (Microsoft.Extensions.DependencyInjection.ServiceDescriptor)\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory/ServiceDescriptorCacheItem& System.Collections.Generic.Dictionary`2<System.Type, Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory/ServiceDescriptorCacheItem>:FindValue (System.Type)\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.CallSiteKind Microsoft.Extensions.DependencyInjection.ServiceLookup.ConstantCallSite:get_Kind ()\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.CallSiteKind Microsoft.Extensions.DependencyInjection.ServiceLookup.ConstructorCallSite:get_Kind ()\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.CallSiteKind Microsoft.Extensions.DependencyInjection.ServiceLookup.IEnumerableCallSite:get_Kind ()\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver:get_Instance ()\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder/GeneratedMethod Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder:<.ctor>b__14_0 (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey,Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite)\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder/GeneratedMethod Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder:BuildType (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite)\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder/GeneratedMethod Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder:BuildTypeNoCache (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite)\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder/GeneratedMethod System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder/GeneratedMethod>:GetOrAdd (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey,System.Func`3<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite, Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder/GeneratedMethod>,Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite)\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder/ILEmitResolverBuilderRuntimeContext Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder:GenerateMethodBody (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite,System.Reflection.Emit.ILGenerator)\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.ResultCache Microsoft.Extensions.DependencyInjection.ServiceLookup.ResultCache:get_None ()\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey:get_Empty ()\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory:CreateCallSite (System.Type,Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain)\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory:CreateConstructorCallSite (Microsoft.Extensions.DependencyInjection.ServiceLookup.ResultCache,System.Type,System.Type,Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain)\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory:GetCallSite (System.Type,Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain)\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory:TryCreateEnumerable (System.Type,Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain)\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory:TryCreateExact (Microsoft.Extensions.DependencyInjection.ServiceDescriptor,System.Type,Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain,int)\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory:TryCreateExact (System.Type,Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain)\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory:TryCreateOpenGeneric (Microsoft.Extensions.DependencyInjection.ServiceDescriptor,System.Type,Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain,int,bool)\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory:TryCreateOpenGeneric (System.Type,Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain)\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite[] Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory:CreateArgumentCallSites (System.Type,Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain,System.Reflection.ParameterInfo[],bool)\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine Microsoft.Extensions.DependencyInjection.ServiceProvider:GetEngine ()\n\tMicrosoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope Microsoft.Extensions.DependencyInjection.ServiceProvider:get_Root ()\n\tMicrosoft.Extensions.DependencyInjection.ServiceProvider Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions:BuildServiceProvider (Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.DependencyInjection.ServiceProviderOptions)\n\tMicrosoft.Extensions.DependencyInjection.ServiceProvider Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions:BuildServiceProvider (Microsoft.Extensions.DependencyInjection.IServiceCollection)\n\tMicrosoft.Extensions.FileProviders.Embedded.Manifest.EmbeddedFilesManifest Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestParser:Parse (System.Reflection.Assembly,string)\n\tMicrosoft.Extensions.FileProviders.Embedded.Manifest.EmbeddedFilesManifest Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestParser:Parse (System.Reflection.Assembly)\n\tMicrosoft.Extensions.FileProviders.Embedded.Manifest.ManifestDirectory Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestDirectory:CreateDirectory (string,Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry[])\n\tMicrosoft.Extensions.FileProviders.Embedded.Manifest.ManifestDirectory Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestSinkDirectory:get_Instance ()\n\tMicrosoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry Microsoft.Extensions.FileProviders.Embedded.Manifest.EmbeddedFilesManifest:ResolveEntry (string)\n\tMicrosoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestDirectory:Traverse (Microsoft.Extensions.Primitives.StringSegment)\n\tMicrosoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry:get_Parent ()\n\tMicrosoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestParser:BuildEntry (System.Xml.Linq.XElement)\n\tMicrosoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry System.SZGenericArrayEnumerator`1<Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry>:get_Current ()\n\tMicrosoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry[] System.Collections.Generic.List`1<Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry>:ToArray ()\n\tMicrosoft.Extensions.FileProviders.Embedded.Manifest.ManifestRootDirectory Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestDirectory:CreateRootDirectory (Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry[])\n\tMicrosoft.Extensions.FileProviders.IFileInfo Microsoft.AspNetCore.Components.WebView.Maui.AndroidAssetFileProvider:GetFileInfo (string)\n\tMicrosoft.Extensions.FileProviders.IFileInfo Microsoft.Extensions.FileProviders.ManifestEmbeddedFileProvider:GetFileInfo (string)\n\tMicrosoft.Extensions.FileProviders.IFileProvider Microsoft.AspNetCore.Components.WebView.WebViewManager/StaticWebAssetsLoader:UseStaticWebAssets (Microsoft.Extensions.FileProviders.IFileProvider)\n\tMicrosoft.Extensions.Logging.ILogger Microsoft.Extensions.Logging.LoggerFactory:CreateLogger (string)\n\tMicrosoft.Extensions.Logging.ILogger`1<Microsoft.AspNetCore.Components.RenderTree.Renderer> Microsoft.Extensions.Logging.LoggerFactoryExtensions:CreateLogger (Microsoft.Extensions.Logging.ILoggerFactory)\n\tMicrosoft.Extensions.Logging.LoggerFactoryOptions Microsoft.Extensions.Options.OptionsFactory`1<Microsoft.Extensions.Logging.LoggerFactoryOptions>:Create (string)\n\tMicrosoft.Extensions.Logging.LoggerFactoryOptions Microsoft.Extensions.Options.OptionsFactory`1<Microsoft.Extensions.Logging.LoggerFactoryOptions>:CreateInstance (string)\n\tMicrosoft.Extensions.Logging.LoggerFactoryOptions Microsoft.Extensions.Options.UnnamedOptionsManager`1<Microsoft.Extensions.Logging.LoggerFactoryOptions>:get_Value ()\n\tMicrosoft.Extensions.Logging.LoggerFactoryOptions System.Activator:CreateInstance ()\n\tMicrosoft.Extensions.Logging.LoggerFilterOptions Microsoft.Extensions.Options.OptionsCache`1/<>c__DisplayClass3_1`1<Microsoft.Extensions.Logging.LoggerFilterOptions, Microsoft.Extensions.Options.IOptionsFactory`1<Microsoft.Extensions.Logging.LoggerFilterOptions>>:<GetOrAdd>b__2 ()\n\tMicrosoft.Extensions.Logging.LoggerFilterOptions Microsoft.Extensions.Options.OptionsCache`1<Microsoft.Extensions.Logging.LoggerFilterOptions>:GetOrAdd (string,System.Func`3<string, Microsoft.Extensions.Options.IOptionsFactory`1<Microsoft.Extensions.Logging.LoggerFilterOptions>, Microsoft.Extensions.Logging.LoggerFilterOptions>,Microsoft.Extensions.Options.IOptionsFactory`1<Microsoft.Extensions.Logging.LoggerFilterOptions>)\n\tMicrosoft.Extensions.Logging.LoggerFilterOptions Microsoft.Extensions.Options.OptionsMonitor`1/<>c<Microsoft.Extensions.Logging.LoggerFilterOptions>:<Get>b__10_0 (string,Microsoft.Extensions.Options.IOptionsFactory`1<Microsoft.Extensions.Logging.LoggerFilterOptions>)\n\tMicrosoft.Extensions.Logging.LoggerFilterOptions Microsoft.Extensions.Options.OptionsMonitor`1<Microsoft.Extensions.Logging.LoggerFilterOptions>:Get (string)\n\tMicrosoft.Extensions.Logging.LoggerFilterOptions Microsoft.Extensions.Options.OptionsMonitor`1<Microsoft.Extensions.Logging.LoggerFilterOptions>:get_CurrentValue ()\n\tMicrosoft.Extensions.Logging.LoggerInformation[] Microsoft.Extensions.Logging.LoggerFactory:CreateLoggers (string)\n\tMicrosoft.Extensions.Logging.LogValuesFormatter Microsoft.Extensions.Logging.LoggerMessage:CreateLogValuesFormatter (string,int)\n\tMicrosoft.Extensions.Logging.MessageLogger[] System.Collections.Generic.List`1<Microsoft.Extensions.Logging.MessageLogger>:ToArray ()\n\tMicrosoft.Extensions.Logging.ScopeLogger[] System.Collections.Generic.List`1<Microsoft.Extensions.Logging.ScopeLogger>:ToArray ()\n\tMicrosoft.Extensions.Primitives.StringSegment Microsoft.Extensions.FileProviders.Embedded.Manifest.EmbeddedFilesManifest:RemoveLeadingAndTrailingDirectorySeparators (string)\n\tMicrosoft.Extensions.Primitives.StringSegment Microsoft.Extensions.Primitives.StringSegment:op_Implicit (string)\n\tMicrosoft.Extensions.Primitives.StringSegment Microsoft.Extensions.Primitives.StringSegment:Subsegment (int,int)\n\tMicrosoft.Extensions.Primitives.StringTokenizer/Enumerator Microsoft.Extensions.Primitives.StringTokenizer:GetEnumerator ()\n\tMicrosoft.JSInterop.DotNetObjectReference`1<Microsoft.AspNetCore.Components.RenderTree.WebRenderer/WebRendererInteropMethods> Microsoft.JSInterop.DotNetObjectReference:Create (Microsoft.AspNetCore.Components.RenderTree.WebRenderer/WebRendererInteropMethods)\n\tMicrosoft.JSInterop.Infrastructure.TaskGenericsUtil/ITcsResultSetter Microsoft.JSInterop.Infrastructure.TaskGenericsUtil:CreateResultSetter (object)\n\tMicrosoft.JSInterop.Infrastructure.TaskGenericsUtil/ITcsResultSetter Microsoft.JSInterop.Infrastructure.TaskGenericsUtil/<>c:<CreateResultSetter>b__12_0 (System.Type)\n\tMicrosoft.JSInterop.JSCallResultType Microsoft.JSInterop.JSCallResultTypeHelper:FromGeneric ()\n\tMicrosoft.JSInterop.JSCallResultType[] System.Enum:GetValues ()\n\tMicrosoft.Win32.SafeHandles.SafeWaitHandle System.Threading.WaitSubsystem:NewEvent (bool,System.Threading.EventResetMode)\n\tMicrosoft.Win32.SafeHandles.SafeWaitHandle System.Threading.WaitSubsystem:NewHandle (System.Threading.WaitSubsystem/WaitableObject)\n\tobject Android.Runtime.JNIEnv/<>c:<CreateNativeArrayElementToManaged>b__108_9 (System.Type,intptr,int)\n\tobject Java.Interop.TypeManager:CreateProxy (System.Type,intptr,Android.Runtime.JniHandleOwnership)\n\tobject Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder:KeyValue (Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame&)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory/<>c:<CreateCallSite>b__16_0 (System.Type)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver:Resolve (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite,Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver:VisitCache (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite,Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext,Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope,Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverLock)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver:VisitConstant (Microsoft.Extensions.DependencyInjection.ServiceLookup.ConstantCallSite,Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver:VisitConstructor (Microsoft.Extensions.DependencyInjection.ServiceLookup.ConstructorCallSite,Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver:VisitDisposeCache (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite,Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver:VisitIEnumerable (Microsoft.Extensions.DependencyInjection.ServiceLookup.IEnumerableCallSite,Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver:VisitRootCache (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite,Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver:VisitScopeCache (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite,Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilderContext, System.Object>:VisitCallSite (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite,Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilderContext)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilderContext, System.Object>:VisitCallSiteMain (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite,Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilderContext)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext, System.Object>:VisitCallSite (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite,Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext, System.Object>:VisitCallSiteMain (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite,Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext, System.Object>:VisitNoCache (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite,Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine/<>c__DisplayClass2_0:<RealizeService>b__0 (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder:VisitConstructor (Microsoft.Extensions.DependencyInjection.ServiceLookup.ConstructorCallSite,Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilderContext)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder:VisitRootCache (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite,Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilderContext)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope:CaptureDisposable (object)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope:GetService (System.Type)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceProvider:GetService (System.Type,Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceProvider:GetService (System.Type)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceProvider/<>c__DisplayClass25_0:<CreateServiceAccessor>b__1 (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceProvider/<>c:<CreateServiceAccessor>b__25_0 (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope)\n\tobject Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions:GetRequiredService (System.IServiceProvider,System.Type)\n\tobject System.Activator:CreateInstance (System.Type,bool,bool)\n\tobject System.Activator:CreateInstance (System.Type,bool)\n\tobject System.Activator:CreateInstance (System.Type,object[])\n\tobject System.Activator:CreateInstance (System.Type,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo,object[])\n\tobject System.Activator:CreateInstance (System.Type,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo)\n\tobject System.Activator:CreateInstance (System.Type)\n\tobject System.AppContext:GetData (string)\n\tobject System.Array:Clone ()\n\tobject System.Array:GetValueImpl (int)\n\tobject System.Convert:ChangeType (object,System.Type,System.IFormatProvider)\n\tobject System.Delegate:get_Target ()\n\tobject System.Enum:InternalBoxEnum (System.RuntimeType,long)\n\tobject System.Enum:Parse (System.Type,string,bool)\n\tobject System.Enum:Parse (System.Type,string)\n\tobject System.Enum:ToObject (System.Type,ulong)\n\tobject System.GC:get_ephemeron_tombstone ()\n\tobject System.Linq.Enumerable/Iterator`1<System.Object>:get_Current ()\n\tobject System.MulticastDelegate:GetTarget ()\n\tobject System.Object:MemberwiseClone ()\n\tobject System.Reflection.ConstructorInfo:Invoke (object[])\n\tobject System.Reflection.ConstructorInvoker:InterpretedInvoke (object,System.Span`1<object>,System.Reflection.BindingFlags)\n\tobject System.Reflection.MethodBase:Invoke (object,object[])\n\tobject System.Reflection.RuntimeConstructorInfo:InternalInvoke (object,System.Span`1<object>&,System.Exception&)\n\tobject System.Reflection.RuntimeConstructorInfo:Invoke (object,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo)\n\tobject System.Reflection.RuntimeConstructorInfo:Invoke (System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo)\n\tobject System.Reflection.RuntimeParameterInfo:get_DefaultValue ()\n\tobject System.Runtime.CompilerServices.RuntimeHelpers:GetUninitializedObject (System.Type)\n\tobject System.Runtime.CompilerServices.RuntimeHelpers:GetUninitializedObjectInternal (intptr)\n\tobject System.Runtime.InteropServices.GCHandle:get_Target ()\n\tobject System.Runtime.InteropServices.GCHandle:InternalGet (intptr)\n\tobject System.Runtime.InteropServices.Marshal:PtrToStructure (intptr,System.Type)\n\tobject System.RuntimeType:CreateInstanceDefaultCtor (bool,bool)\n\tobject System.RuntimeType:CreateInstanceForAnotherGenericParameter (System.Type,System.RuntimeType,System.RuntimeType)\n\tobject System.RuntimeType:CreateInstanceImpl (System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo)\n\tobject System.RuntimeType:CreateInstanceInternal (System.Runtime.CompilerServices.QCallTypeHandle)\n\tobject System.RuntimeType:CreateInstanceMono (bool,bool)\n\tobject System.RuntimeType:CreateInstanceOfT ()\n\tobject System.Text.Json.JsonSerializer:Deserialize (System.ReadOnlySpan`1<char>,System.Type,System.Text.Json.JsonSerializerOptions)\n\tobject System.Text.Json.JsonSerializer:Deserialize (System.Text.Json.Utf8JsonReader&,System.Type,System.Text.Json.JsonSerializerOptions)\n\tobject System.Text.Json.JsonSerializer:Read (System.Text.Json.Utf8JsonReader&,System.Text.Json.Serialization.Metadata.JsonTypeInfo)\n\tobject System.Text.Json.JsonSerializer:ReadCore (System.Text.Json.Utf8JsonReader&,System.Text.Json.Serialization.Metadata.JsonTypeInfo,System.Text.Json.ReadStack&)\n\tobject System.Text.Json.JsonSerializer:ReadFromSpan (System.ReadOnlySpan`1<byte>,System.Text.Json.Serialization.Metadata.JsonTypeInfo,System.Nullable`1<int>)\n\tobject System.Text.Json.JsonSerializer:ReadFromSpan (System.ReadOnlySpan`1<char>,System.Text.Json.Serialization.Metadata.JsonTypeInfo)\n\tobject System.Threading.PortableThreadPool:CreateThreadLocalCompletionCountObject ()\n\tobject System.Threading.PortableThreadPool:GetOrCreateThreadLocalCompletionCountObject ()\n\tobject System.Threading.ThreadInt64PersistentCounter:CreateThreadLocalCountObject ()\n\tobject System.Threading.ThreadPool:GetOrCreateThreadLocalCompletionCountObject ()\n\tobject System.Threading.ThreadPoolWorkQueue:Dequeue (System.Threading.ThreadPoolWorkQueueThreadLocals,bool&)\n\tobject System.Threading.ThreadPoolWorkQueue/WorkStealingQueue:LocalPop ()\n\tobject[] Android.Runtime.JNIEnv:GetObjectArray (intptr,System.Type[])\n\tobject[] System.Reflection.CustomAttribute:GetCustomAttributes (System.Reflection.ICustomAttributeProvider,System.Type,bool)\n\tobject[] System.Reflection.CustomAttribute:GetCustomAttributesBase (System.Reflection.ICustomAttributeProvider,System.Type,bool)\n\tobject[] System.Reflection.CustomAttribute:GetPseudoCustomAttributes (System.Reflection.ICustomAttributeProvider,System.Type)\n\tobject[] System.Reflection.CustomAttribute:GetPseudoCustomAttributes (System.Type)\n\tobject[] System.RuntimeType:GetCustomAttributes (bool)\n\tobject[] System.RuntimeType:GetCustomAttributes (System.Type,bool)\n\tobject& System.Collections.Generic.Dictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, System.Object>:FindValue (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey)\n\tSpice.RootComponent System.Collections.Generic.List`1/Enumerator<Spice.RootComponent>:get_Current ()\n\tstring Android.Net.UriInvoker:ToString ()\n\tstring Android.Runtime.AndroidTypeManager:GetReplacementTypeCore (string)\n\tstring Android.Runtime.AndroidTypeManager:GetSimpleReference (System.Type)\n\tstring Android.Runtime.JNIEnv:GetCharSequence (intptr,Android.Runtime.JniHandleOwnership)\n\tstring Android.Runtime.JNIEnv:GetClassNameFromInstance (intptr)\n\tstring Android.Runtime.JNIEnv:GetJniName (System.Type)\n\tstring Android.Runtime.JNIEnv:GetString (intptr,Android.Runtime.JniHandleOwnership)\n\tstring Android.Runtime.JNIEnv:TypemapManagedToJava (System.Type)\n\tstring Android.Webkit.WebMessage:get_Data ()\n\tstring Java.Interop.JniEnvironment/Strings:ToString (Java.Interop.JniObjectReference)\n\tstring Java.Interop.JniEnvironment/Strings:ToString (Java.Interop.JniObjectReference&,Java.Interop.JniObjectReferenceOptions)\n\tstring Java.Interop.JniPeerMembers:GetReplacementType (string)\n\tstring Java.Interop.JniRuntime/JniTypeManager:GetReplacementType (string)\n\tstring Java.Interop.JniTypeSignature:get_Name ()\n\tstring Java.Interop.Tools.TypeNameMappings.JavaNativeTypeManager:GetPrimitiveClass (System.Type)\n\tstring Java.Interop.Tools.TypeNameMappings.JavaNativeTypeManager:ToJniName (string,int)\n\tstring Java.Interop.Tools.TypeNameMappings.JavaNativeTypeManager:ToJniName (System.Type,Java.Interop.ExportParameterKind)\n\tstring Java.Interop.Tools.TypeNameMappings.JavaNativeTypeManager:ToJniName (System.Type)\n\tstring Java.Interop.TypeManager:GetClassName (intptr)\n\tstring Java.Lang.String:ToString ()\n\tstring Java.Lang.Throwable:_GetMessage (intptr)\n\tstring Microsoft.AspNetCore.Components.NavigationManager:get_BaseUri ()\n\tstring Microsoft.AspNetCore.Components.NavigationManager:get_Uri ()\n\tstring Microsoft.AspNetCore.Components.NavigationManager:NormalizeBaseUri (string)\n\tstring Microsoft.AspNetCore.Components.NavigationManager:ToBaseRelativePath (string)\n\tstring Microsoft.AspNetCore.Components.Routing.NavLink:CombineWithSpace (string,string)\n\tstring Microsoft.AspNetCore.Components.Routing.Router:TrimQueryOrHash (string)\n\tstring Microsoft.AspNetCore.Components.WebView.FileExtensionContentTypeProvider:GetExtension (string)\n\tstring Microsoft.AspNetCore.Components.WebView.IpcCommon:Serialize (Microsoft.AspNetCore.Components.WebView.IpcCommon/OutgoingMessageType,object[])\n\tstring Microsoft.AspNetCore.Components.WebView.IpcCommon:Serialize (string,object[])\n\tstring Microsoft.AspNetCore.Components.WebView.Maui.AndroidAssetFileProvider/AndroidMauiAssetFileInfo:get_Name ()\n\tstring Microsoft.AspNetCore.Components.WebView.StaticContentProvider:GetResponseContentTypeOrDefault (string)\n\tstring Microsoft.AspNetCore.Components.WebView.WebViewManager/StaticWebAssetsLoader:ResolveRelativeToAssembly ()\n\tstring Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestParser:EnsureName (System.Xml.Linq.XElement)\n\tstring Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestParser:EnsureText (System.Xml.Linq.XElement)\n\tstring Microsoft.Extensions.Internal.TypeNameHelper:GetTypeDisplayName (System.Type,bool,bool,bool,char)\n\tstring Spice.UriExtensions:RemovePossibleQueryString (string)\n\tstring System.Collections.Generic.Dictionary`2<System.String, System.String>:get_Item (string)\n\tstring System.Convert:ToBase64String (byte[],int,int,System.Base64FormattingOptions)\n\tstring System.Convert:ToBase64String (byte[],int,int)\n\tstring System.Convert:ToBase64String (System.ReadOnlySpan`1<byte>,System.Base64FormattingOptions)\n\tstring System.Convert:ToString (object,System.IFormatProvider)\n\tstring System.Enum:GetEnumName (System.Enum/EnumInfo,ulong)\n\tstring System.Enum:InternalFormat (System.RuntimeType,ulong)\n\tstring System.Enum:ToString ()\n\tstring System.Enum:ToString (string,System.IFormatProvider)\n\tstring System.Enum:ToString (string)\n\tstring System.Environment:GetEnvironmentVariable (string)\n\tstring System.Environment:GetEnvironmentVariableCore (string)\n\tstring System.Globalization.CultureData:get_CultureName ()\n\tstring System.Globalization.CultureInfo:get_SortName ()\n\tstring System.Int32:ToString ()\n\tstring System.IO.Path:Combine (string,string)\n\tstring System.IO.Path:CombineInternal (string,string)\n\tstring System.IO.Path:GetDirectoryName (string)\n\tstring System.IO.Path:GetFileName (string)\n\tstring System.IO.Path:GetFullPath (string)\n\tstring System.IO.Path:GetFullPathInternal (string)\n\tstring System.IO.Path:GetRelativePath (string,string,System.StringComparison)\n\tstring System.IO.Path:GetRelativePath (string,string)\n\tstring System.IO.Path:JoinInternal (System.ReadOnlySpan`1<char>,System.ReadOnlySpan`1<char>)\n\tstring System.IO.PathInternal:NormalizeDirectorySeparators (string)\n\tstring System.IO.PathInternal:RemoveRelativeSegments (string,int)\n\tstring System.IPv4AddressHelper:ParseCanonicalName (string,int,int,bool&)\n\tstring System.Number:Int32ToDecStr (int)\n\tstring System.Number:UInt32ToDecStr (uint)\n\tstring System.Private.CoreLib.Interop/Sys:GetCwd ()\n\tstring System.Private.CoreLib.Interop/Sys:GetCwdHelper (byte*,int)\n\tstring System.Private.CoreLib.KeyCollection/Enumerator<System.String, System.String>:get_Current ()\n\tstring System.ReadOnlySpan`1<System.Char>:ToString ()\n\tstring System.Reflection.RuntimeAssembly:get_FullName ()\n\tstring System.Reflection.RuntimeAssembly:get_Location ()\n\tstring System.Reflection.RuntimeAssembly:GetInfo (System.Reflection.RuntimeAssembly/AssemblyInfoKind)\n\tstring System.Reflection.RuntimePropertyInfo:get_Name ()\n\tstring System.Runtime.CompilerServices.DefaultInterpolatedStringHandler:ToStringAndClear ()\n\tstring System.Runtime.InteropServices.Marshal:PtrToStringUTF8 (intptr)\n\tstring System.RuntimeType:get_FullName ()\n\tstring System.RuntimeType:get_Name ()\n\tstring System.RuntimeType:getFullName (bool,bool)\n\tstring System.RuntimeType:ToString ()\n\tstring System.Span`1<System.Char>:ToString ()\n\tstring System.String:Concat (string,string,string)\n\tstring System.String:Concat (string,string)\n\tstring System.String:Concat (System.ReadOnlySpan`1<char>,System.ReadOnlySpan`1<char>,System.ReadOnlySpan`1<char>)\n\tstring System.String:Concat (System.ReadOnlySpan`1<char>,System.ReadOnlySpan`1<char>)\n\tstring System.String:CreateStringForSByteConstructor (byte*,int)\n\tstring System.String:CreateStringFromEncoding (byte*,int,System.Text.Encoding)\n\tstring System.String:CreateTrimmedString (int,int)\n\tstring System.String:Ctor (char,int)\n\tstring System.String:Ctor (char[],int,int)\n\tstring System.String:Ctor (char*,int,int)\n\tstring System.String:Ctor (char*)\n\tstring System.String:Ctor (sbyte*)\n\tstring System.String:Ctor (System.ReadOnlySpan`1<char>)\n\tstring System.String:InternalSubString (int,int)\n\tstring System.String:Substring (int,int)\n\tstring System.String:Substring (int)\n\tstring System.String:ToString ()\n\tstring System.String:ToString (System.IFormatProvider)\n\tstring System.String:Trim (char)\n\tstring System.String:TrimHelper (char*,int,System.Text.TrimType)\n\tstring System.Text.Encoding:get_WebName ()\n\tstring System.Text.Encoding:GetString (System.ReadOnlySpan`1<byte>)\n\tstring System.Text.EncodingTable:GetDisplayName (int,int)\n\tstring System.Text.Json.JsonDocument:GetString (int,System.Text.Json.JsonTokenType)\n\tstring System.Text.Json.JsonElement:GetString ()\n\tstring System.Text.Json.JsonReaderHelper:GetTextFromUtf8 (System.ReadOnlySpan`1<byte>)\n\tstring System.Text.Json.JsonReaderHelper:TranscodeHelper (System.ReadOnlySpan`1<byte>)\n\tstring System.Text.Json.JsonSerializer:Serialize (object[],System.Text.Json.JsonSerializerOptions)\n\tstring System.Text.Json.JsonSerializer:WriteString (object[]&,System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<object[]>)\n\tstring System.Text.Json.Serialization.Converters.EnumConverter`1<Microsoft.JSInterop.JSCallResultType>:FormatJsonName (string,System.Text.Json.JsonNamingPolicy)\n\tstring System.Text.StringBuilder:ToString ()\n\tstring System.Text.StringBuilderCache:GetStringAndRelease (System.Text.StringBuilder)\n\tstring System.Text.ValueStringBuilder:ToString ()\n\tstring System.Text.ValueStringBuilder:ToString ()\n\tstring System.Text.ValueStringBuilder:ToString ()\n\tstring System.Uri:CombineUri (System.Uri,string,System.UriFormat)\n\tstring System.Uri:CreateHostStringHelper (string,int,int,System.Uri/Flags&,string&)\n\tstring System.Uri:get_AbsolutePath ()\n\tstring System.Uri:get_AbsoluteUri ()\n\tstring System.Uri:get_Host ()\n\tstring System.Uri:get_PrivateAbsolutePath ()\n\tstring System.Uri:get_Scheme ()\n\tstring System.Uri:GetComponentsHelper (System.UriComponents,System.UriFormat)\n\tstring System.Uri:GetEscapedParts (System.UriComponents)\n\tstring System.Uri:GetParts (System.UriComponents,System.UriFormat)\n\tstring System.Uri:GetUnescapedParts (System.UriComponents,System.UriFormat)\n\tstring System.Uri:GetUriPartsFromUserString (System.UriComponents)\n\tstring System.Uri:InternalGetComponents (System.UriComponents,System.UriFormat)\n\tstring System.Uri:PathDifference (string,string,bool)\n\tstring System.Uri:ReCreateParts (System.UriComponents,uint16,System.UriFormat)\n\tstring System.Uri:ToString ()\n\tstring System.UriParser:get_SchemeName ()\n\tstring System.Xml.Linq.XContainer:GetStringValue (object)\n\tstring System.Xml.Linq.XElement:get_Value ()\n\tstring System.Xml.Linq.XNamespace:ExtractLocalName (System.Xml.Linq.XName)\n\tstring System.Xml.NameTable:Add (char[],int,int)\n\tstring System.Xml.NameTable:Add (string)\n\tstring System.Xml.NameTable:AddEntry (string,int)\n\tstring System.Xml.NameTable:Get (string)\n\tstring System.Xml.XmlConvert:VerifyNCName (string,System.Xml.ExceptionType)\n\tstring System.Xml.XmlConvert:VerifyNCName (string)\n\tstring System.Xml.XmlTextReaderImpl:get_LocalName ()\n\tstring System.Xml.XmlTextReaderImpl:get_NamespaceURI ()\n\tstring System.Xml.XmlTextReaderImpl:get_Prefix ()\n\tstring System.Xml.XmlTextReaderImpl:get_Value ()\n\tstring System.Xml.XmlTextReaderImpl:GetAttribute (string)\n\tstring System.Xml.XmlTextReaderImpl/NodeData:get_StringValue ()\n\tstring[] System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<System.String>:Rent (int)\n\tstring[] System.Enum:GetNames ()\n\tstring[] System.Enum:InternalGetNames (System.RuntimeType)\n\tstring[] System.GC:AllocateArray (int,bool)\n\tstring[] System.GC:AllocateUninitializedArray (int,bool)\n\tstring[] System.ReadOnlySpan`1<System.String>:ToArray ()\n\tstring[] System.String:CreateSplitArrayOfThisAsSoleValue (System.StringSplitOptions,int)\n\tstring[] System.String:Split (char,System.StringSplitOptions)\n\tstring[] System.String:SplitInternal (System.ReadOnlySpan`1<char>,int,System.StringSplitOptions)\n\tSystem.Action System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult, Microsoft.JSInterop.JSRuntime/<InvokeAsync>d__16`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>>:get_MoveNextAction ()\n\tSystem.Action System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.RenderTree.Renderer/<GetErrorHandledTask>d__71>:get_MoveNextAction ()\n\tSystem.Action System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.RenderTree.Renderer/<InvokeRenderCompletedCallsAfterUpdateDisplayTask>d__66>:get_MoveNextAction ()\n\tSystem.Action System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.Routing.FocusOnNavigate/<OnAfterRenderAsync>d__15>:get_MoveNextAction ()\n\tSystem.Action System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.WebView.<>c__DisplayClass13_0/<<NotifyErrors>g__AwaitAndNotify|0>d>:get_MoveNextAction ()\n\tSystem.Action System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.JSInterop.JSRuntimeExtensions/<InvokeVoidAsync>d__0>:get_MoveNextAction ()\n\tSystem.Action`2<System.IServiceProvider, Microsoft.AspNetCore.Components.IComponent> Microsoft.AspNetCore.Components.ComponentFactory:CreateInitializer (System.Type)\n\tSystem.Action`4<Microsoft.Extensions.Logging.ILogger, int, System.Type, System.Exception> Microsoft.Extensions.Logging.LoggerMessage:Define (Microsoft.Extensions.Logging.LogLevel,Microsoft.Extensions.Logging.EventId,string,Microsoft.Extensions.Logging.LogDefineOptions)\n\tSystem.Action`4<Microsoft.Extensions.Logging.ILogger, string, string, System.Exception> Microsoft.Extensions.Logging.LoggerMessage:Define (Microsoft.Extensions.Logging.LogLevel,Microsoft.Extensions.Logging.EventId,string,Microsoft.Extensions.Logging.LogDefineOptions)\n\tSystem.Action`4<Microsoft.Extensions.Logging.ILogger, ulong, string, System.Exception> Microsoft.Extensions.Logging.LoggerMessage:Define (Microsoft.Extensions.Logging.LogLevel,Microsoft.Extensions.Logging.EventId,string,Microsoft.Extensions.Logging.LogDefineOptions)\n\tSystem.Action`5<Microsoft.Extensions.Logging.ILogger, System.Type, string, string, System.Exception> Microsoft.Extensions.Logging.LoggerMessage:Define (Microsoft.Extensions.Logging.LogLevel,Microsoft.Extensions.Logging.EventId,string,Microsoft.Extensions.Logging.LogDefineOptions)\n\tSystem.Action`6<Microsoft.Extensions.Logging.ILogger, int, System.Type, int, System.Type, System.Exception> Microsoft.Extensions.Logging.LoggerMessage:Define (Microsoft.Extensions.Logging.LogLevel,Microsoft.Extensions.Logging.EventId,string,Microsoft.Extensions.Logging.LogDefineOptions)\n\tSystem.Array Android.Runtime.JNIEnv:_GetArray (intptr,System.Type)\n\tSystem.Array Android.Runtime.JNIEnv:GetArray (intptr,Android.Runtime.JniHandleOwnership,System.Type)\n\tSystem.Array Android.Runtime.JNIEnv/<>c:<CreateNativeArrayToManaged>b__134_1 (System.Type,intptr,int)\n\tSystem.Array Android.Runtime.JNIEnv/<>c:<CreateNativeArrayToManaged>b__134_12 (System.Type,intptr,int)\n\tSystem.Array System.Array:CreateInstance (System.Type,int)\n\tSystem.Array System.Array:InternalCreate (System.RuntimeType,int,int*,int*)\n\tSystem.Array System.Enum:GetValues (System.Type)\n\tSystem.Array System.RuntimeType:GetEnumValues ()\n\tSystem.Attribute System.Attribute:GetAttr (System.Reflection.ICustomAttributeProvider,System.Type,bool)\n\tSystem.Attribute System.Attribute:GetCustomAttribute (System.Reflection.MemberInfo,System.Type,bool)\n\tSystem.Attribute System.Attribute:GetCustomAttribute (System.Reflection.MemberInfo,System.Type)\n\tSystem.Attribute System.Reflection.CustomAttributeExtensions:GetCustomAttribute (System.Reflection.MemberInfo,System.Type,bool)\n\tSystem.Attribute System.Reflection.CustomAttributeExtensions:GetCustomAttribute (System.Reflection.MemberInfo,System.Type)\n\tSystem.Attribute[] System.Attribute:GetCustomAttributes (System.Reflection.MemberInfo,System.Type,bool)\n\tSystem.Attribute[] System.Reflection.CustomAttribute:GetCustomAttributesInternal (System.Reflection.ICustomAttributeProvider,System.Type,bool)\n\tSystem.AttributeUsageAttribute System.Reflection.CustomAttribute:RetrieveAttributeUsage (System.Type)\n\tSystem.AttributeUsageAttribute System.Reflection.CustomAttribute:RetrieveAttributeUsageNoCache (System.Type)\n\tSystem.Buffers.ArrayPool`1<byte> System.Buffers.ArrayPool`1<System.Byte>:get_Shared ()\n\tSystem.Buffers.ArrayPool`1<char> System.Buffers.ArrayPool`1<System.Char>:get_Shared ()\n\tSystem.Buffers.ArrayPool`1<int> System.Buffers.ArrayPool`1<System.Int32>:get_Shared ()\n\tSystem.Buffers.ArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff> System.Buffers.ArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff>:get_Shared ()\n\tSystem.Buffers.ArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit> System.Buffers.ArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit>:get_Shared ()\n\tSystem.Buffers.ArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame> System.Buffers.ArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>:get_Shared ()\n\tSystem.Buffers.ArrayPool`1<ulong> System.Buffers.ArrayPool`1<System.UInt64>:get_Shared ()\n\tSystem.Buffers.OperationStatus System.Buffers.Text.Base64:EncodeToUtf8 (System.ReadOnlySpan`1<byte>,System.Span`1<byte>,int&,int&,bool)\n\tSystem.Buffers.OperationStatus System.Text.Json.JsonWriterHelper:ToUtf8 (System.ReadOnlySpan`1<byte>,System.Span`1<byte>,int&,int&)\n\tSystem.Buffers.OperationStatus System.Text.Rune:DecodeFromUtf8 (System.ReadOnlySpan`1<byte>,System.Text.Rune&,int&)\n\tSystem.Buffers.OperationStatus System.Text.Unicode.Utf8Utility:TranscodeToUtf16 (byte*,int,char*,int,byte*&,char*&)\n\tSystem.Buffers.OperationStatus System.Text.Unicode.Utf8Utility:TranscodeToUtf8 (char*,int,byte*,int,char*&,byte*&)\n\tSystem.Buffers.OperationStatus System.Text.UTF8Encoding:DecodeFirstRune (System.ReadOnlySpan`1<byte>,System.Text.Rune&,int&)\n\tSystem.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/ThreadLocalArray<byte>[] System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<System.Byte>:InitializeTlsBucketsAndTrimming ()\n\tSystem.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/ThreadLocalArray<char>[] System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<System.Char>:InitializeTlsBucketsAndTrimming ()\n\tSystem.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/ThreadLocalArray<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff>[] System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff>:InitializeTlsBucketsAndTrimming ()\n\tSystem.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/ThreadLocalArray<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit>[] System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit>:InitializeTlsBucketsAndTrimming ()\n\tSystem.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/ThreadLocalArray<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>[] System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>:InitializeTlsBucketsAndTrimming ()\n\tSystem.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/ThreadLocalArray<string>[] System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<System.String>:InitializeTlsBucketsAndTrimming ()\n\tSystem.Collections.Generic.Dictionary`2/Enumerator<string, Microsoft.Extensions.Logging.Logger> System.Collections.Generic.Dictionary`2<System.String, Microsoft.Extensions.Logging.Logger>:GetEnumerator ()\n\tSystem.Collections.Generic.Dictionary`2/KeyCollection<string, string> System.Collections.Generic.Dictionary`2<System.String, System.String>:get_Keys ()\n\tSystem.Collections.Generic.Dictionary`2<string, System.Type> Java.Interop.TypeManagerMapDictionaries:get_JniToManaged ()\n\tSystem.Collections.Generic.Dictionary`2<System.Type, System.Func`2<System.Array, intptr>> Android.Runtime.JNIEnv:CreateCreateManagedToNativeArray ()\n\tSystem.Collections.Generic.Dictionary`2<System.Type, System.Func`2<System.Array, intptr>> Android.Runtime.JNIEnv:get_CreateManagedToNativeArray ()\n\tSystem.Collections.Generic.Dictionary`2<System.Type, System.Func`4<System.Type, intptr, int, object>> Android.Runtime.JNIEnv:CreateNativeArrayElementToManaged ()\n\tSystem.Collections.Generic.Dictionary`2<System.Type, System.Func`4<System.Type, intptr, int, object>> Android.Runtime.JNIEnv:get_NativeArrayElementToManaged ()\n\tSystem.Collections.Generic.Dictionary`2<System.Type, System.Func`4<System.Type, intptr, int, System.Array>> Android.Runtime.JNIEnv:CreateNativeArrayToManaged ()\n\tSystem.Collections.Generic.Dictionary`2<System.Type, System.Func`4<System.Type, intptr, int, System.Array>> Android.Runtime.JNIEnv:get_NativeArrayToManaged ()\n\tSystem.Collections.Generic.Dictionary`2<System.Type, System.Text.Json.Serialization.JsonConverter> System.Text.Json.Serialization.Metadata.DefaultJsonTypeInfoResolver:GetDefaultSimpleConverters ()\n\tSystem.Collections.Generic.EqualityComparer`1<int> System.Collections.Generic.EqualityComparer`1<System.Int32>:CreateComparer ()\n\tSystem.Collections.Generic.EqualityComparer`1<intptr> System.Collections.Generic.EqualityComparer`1<System.IntPtr>:CreateComparer ()\n\tSystem.Collections.Generic.EqualityComparer`1<long> System.Collections.Generic.EqualityComparer`1<System.Int64>:CreateComparer ()\n\tSystem.Collections.Generic.EqualityComparer`1<Microsoft.AspNetCore.Components.Routing.RouteKey> System.Collections.Generic.EqualityComparer`1<Microsoft.AspNetCore.Components.Routing.RouteKey>:CreateComparer ()\n\tSystem.Collections.Generic.EqualityComparer`1<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey> System.Collections.Generic.EqualityComparer`1<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey>:CreateComparer ()\n\tSystem.Collections.Generic.EqualityComparer`1<Microsoft.JSInterop.Infrastructure.DotNetDispatcher/AssemblyKey> System.Collections.Generic.EqualityComparer`1<Microsoft.JSInterop.Infrastructure.DotNetDispatcher/AssemblyKey>:CreateComparer ()\n\tSystem.Collections.Generic.EqualityComparer`1<Spice.Align> System.Collections.Generic.EqualityComparer`1<Spice.Align>:CreateComparer ()\n\tSystem.Collections.Generic.EqualityComparer`1<string> System.Collections.Generic.EqualityComparer`1<System.String>:CreateComparer ()\n\tSystem.Collections.Generic.EqualityComparer`1<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>> System.Collections.Generic.EqualityComparer`1<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>:CreateComparer ()\n\tSystem.Collections.Generic.EqualityComparer`1<ulong> System.Collections.Generic.EqualityComparer`1<System.UInt64>:CreateComparer ()\n\tSystem.Collections.Generic.HashSet`1/Enumerator<string> System.Collections.Generic.HashSet`1<System.String>:GetEnumerator ()\n\tSystem.Collections.Generic.HashSet`1<string> Microsoft.AspNetCore.Components.RouteTableFactory:GetParameterNames (Microsoft.AspNetCore.Components.Routing.RouteTemplate)\n\tSystem.Collections.Generic.IArraySortHelper`1<System.Reflection.ConstructorInfo> System.Collections.Generic.ArraySortHelper`1<System.Reflection.ConstructorInfo>:CreateArraySortHelper ()\n\tSystem.Collections.Generic.ICollection`1<string> System.Collections.Generic.Dictionary`2<System.String, System.String>:System.Collections.Generic.IDictionary<TKey,TValue>.get_Keys ()\n\tSystem.Collections.Generic.IDictionary`2<string, string> Microsoft.AspNetCore.Components.WebView.StaticContentProvider:GetResponseHeaders (string)\n\tSystem.Collections.Generic.IEnumerable`1<char> System.Linq.Enumerable:Where (System.Collections.Generic.IEnumerable`1<char>,System.Func`2<char, bool>)\n\tSystem.Collections.Generic.IEnumerable`1<object> System.Linq.Enumerable:Prepend (System.Collections.Generic.IEnumerable`1<object>,object)\n\tSystem.Collections.Generic.IEnumerable`1<System.Attribute> System.Reflection.CustomAttributeExtensions:GetCustomAttributes (System.Reflection.MemberInfo,System.Type,bool)\n\tSystem.Collections.Generic.IEnumerable`1<System.Reflection.PropertyInfo> Microsoft.AspNetCore.Components.Reflection.ComponentProperties:GetCandidateBindableProperties (System.Type)\n\tSystem.Collections.Generic.IEnumerable`1<System.Reflection.PropertyInfo> Microsoft.AspNetCore.Components.Reflection.MemberAssignment:GetPropertiesIncludingInherited (System.Type,System.Reflection.BindingFlags)\n\tSystem.Collections.Generic.IEnumerable`1<System.Text.Json.Serialization.JsonDerivedTypeAttribute> System.Reflection.CustomAttributeExtensions:GetCustomAttributes (System.Reflection.MemberInfo,bool)\n\tSystem.Collections.Generic.IEnumerable`1<System.Type> System.Reflection.Assembly:get_ExportedTypes ()\n\tSystem.Collections.Generic.IEnumerable`1<System.Xml.Linq.XElement> System.Xml.Linq.XContainer:Elements ()\n\tSystem.Collections.Generic.IEnumerable`1<System.Xml.Linq.XElement> System.Xml.Linq.XContainer:GetElements (System.Xml.Linq.XName)\n\tSystem.Collections.Generic.IEnumerable`1<System.Xml.Linq.XNode> System.Xml.Linq.XContainer:Nodes ()\n\tSystem.Collections.Generic.IEnumerator`1<char> System.Linq.Enumerable/Iterator`1<System.Char>:GetEnumerator ()\n\tSystem.Collections.Generic.IEnumerator`1<Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry> System.Array:InternalArray__IEnumerable_GetEnumerator ()\n\tSystem.Collections.Generic.IEnumerator`1<object> System.Linq.Enumerable/Iterator`1<System.Object>:GetEnumerator ()\n\tSystem.Collections.Generic.IEnumerator`1<Spice.RootComponent> System.Collections.Generic.List`1<Spice.RootComponent>:System.Collections.Generic.IEnumerable<T>.GetEnumerator ()\n\tSystem.Collections.Generic.IEnumerator`1<Spice.RootComponent> System.Collections.ObjectModel.Collection`1<Spice.RootComponent>:GetEnumerator ()\n\tSystem.Collections.Generic.IEnumerator`1<string> System.Collections.Generic.Dictionary`2/KeyCollection<System.String, System.String>:System.Collections.Generic.IEnumerable<TKey>.GetEnumerator ()\n\tSystem.Collections.Generic.IEnumerator`1<System.Collections.Generic.KeyValuePair`2<string, object>> System.Collections.Generic.Dictionary`2<System.String, System.Object>:System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<TKey,TValue>>.GetEnumerator ()\n\tSystem.Collections.Generic.IEnumerator`1<System.Collections.Generic.KeyValuePair`2<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Serialization.Metadata.ReflectionEmitCachingMemberAccessor/Cache`1/CacheEntry<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>>>> System.Collections.Concurrent.ConcurrentDictionary`2<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Cache`1/CacheEntry<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>>:GetEnumerator ()\n\tSystem.Collections.Generic.IEnumerator`1<System.Reflection.PropertyInfo> Microsoft.AspNetCore.Components.Reflection.MemberAssignment/<GetPropertiesIncludingInherited>d__0:System.Collections.Generic.IEnumerable<System.Reflection.PropertyInfo>.GetEnumerator ()\n\tSystem.Collections.Generic.IEnumerator`1<System.Text.Json.Serialization.JsonConverter> System.Text.Json.Serialization.ConfigurationList`1<System.Text.Json.Serialization.JsonConverter>:GetEnumerator ()\n\tSystem.Collections.Generic.IEnumerator`1<System.Xml.Linq.XElement> System.Xml.Linq.XContainer/<GetElements>d__39:System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement>.GetEnumerator ()\n\tSystem.Collections.Generic.IEnumerator`1<System.Xml.Linq.XNode> System.Xml.Linq.XContainer/<Nodes>d__18:System.Collections.Generic.IEnumerable<System.Xml.Linq.XNode>.GetEnumerator ()\n\tSystem.Collections.Generic.IEqualityComparer`1<string> System.Collections.Generic.NonRandomizedStringEqualityComparer:GetStringComparer (object)\n\tSystem.Collections.Generic.IReadOnlyList`1<Microsoft.AspNetCore.Components.CascadingParameterState> Microsoft.AspNetCore.Components.CascadingParameterState:FindCascadingParameters (Microsoft.AspNetCore.Components.Rendering.ComponentState)\n\tSystem.Collections.Generic.KeyValuePair`2<string, object> System.Collections.Generic.Dictionary`2/Enumerator<System.String, System.Object>:get_Current ()\n\tSystem.Collections.Generic.KeyValuePair`2<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Serialization.Metadata.ReflectionEmitCachingMemberAccessor/Cache`1/CacheEntry<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>>> System.Collections.Concurrent.ConcurrentDictionary`2/Enumerator<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Cache`1/CacheEntry<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>>:get_Current ()\n\tSystem.Collections.Generic.List`1/Enumerator<System.Collections.Generic.KeyValuePair`2<string, System.Text.Json.Serialization.Metadata.JsonPropertyInfo>> System.Collections.Generic.List`1<System.Collections.Generic.KeyValuePair`2<System.String, System.Text.Json.Serialization.Metadata.JsonPropertyInfo>>:GetEnumerator ()\n\tSystem.Collections.Generic.List`1/Enumerator<System.Text.Json.Serialization.JsonConverter> System.Collections.Generic.List`1<System.Text.Json.Serialization.JsonConverter>:GetEnumerator ()\n\tSystem.Collections.Generic.List`1/Enumerator<System.ValueTuple`3<string, System.Type, Microsoft.AspNetCore.Components.Reflection.PropertySetter>> System.Collections.Generic.List`1<System.ValueTuple`3<System.String, System.Type, Microsoft.AspNetCore.Components.Reflection.PropertySetter>>:GetEnumerator ()\n\tSystem.Collections.Generic.List`1<string> Microsoft.AspNetCore.Components.RouteTableFactory:GetUnusedParameterNames (System.Collections.Generic.HashSet`1<string>,System.Collections.Generic.HashSet`1<string>)\n\tSystem.Collections.Generic.List`1<string> Microsoft.Extensions.Logging.LogValuesFormatter:get_ValueNames ()\n\tSystem.Collections.Generic.List`1<System.Type> Microsoft.AspNetCore.Components.RouteTableFactory:GetRouteableComponents (Microsoft.AspNetCore.Components.Routing.RouteKey)\n\tSystem.Collections.Generic.ReferenceEqualityComparer System.Collections.Generic.ReferenceEqualityComparer:get_Instance ()\n\tSystem.DateTime System.DateTime:FromFileTimeUtc (long)\n\tSystem.DateTime System.DateTime:get_UtcNow ()\n\tSystem.DateTime System.DateTime:SpecifyKind (System.DateTime,System.DateTimeKind)\n\tSystem.DateTime System.DateTimeOffset:get_UtcDateTime ()\n\tSystem.DateTime System.DateTimeOffset:ValidateDate (System.DateTime,System.TimeSpan)\n\tSystem.DateTime System.IO.File:GetLastWriteTimeUtc (string)\n\tSystem.DateTimeOffset Microsoft.Extensions.FileProviders.ManifestEmbeddedFileProvider:ResolveLastModified (System.Reflection.Assembly)\n\tSystem.DateTimeOffset System.DateTimeOffset:FromUnixTimeSeconds (long)\n\tSystem.DateTimeOffset System.DateTimeOffset:get_UtcNow ()\n\tSystem.DateTimeOffset System.DateTimeOffset:op_Implicit (System.DateTime)\n\tSystem.DateTimeOffset System.IO.FileStatus:GetLastWriteTime (Microsoft.Win32.SafeHandles.SafeFileHandle,System.ReadOnlySpan`1<char>,bool)\n\tSystem.DateTimeOffset System.IO.FileStatus:GetLastWriteTime (System.ReadOnlySpan`1<char>,bool)\n\tSystem.DateTimeOffset System.IO.FileSystem:GetLastWriteTime (string)\n\tSystem.Delegate Android.App.Activity:GetOnCreate_Landroid_os_Bundle_Handler ()\n\tSystem.Delegate Android.Runtime.JNINativeWrapper:CreateBuiltInDelegate (System.Delegate,System.Type)\n\tSystem.Delegate Android.Runtime.JNINativeWrapper:CreateDelegate (System.Delegate)\n\tSystem.Delegate Android.Webkit.IValueCallbackInvoker:GetOnReceiveValue_Ljava_lang_Object_Handler ()\n\tSystem.Delegate Android.Webkit.WebChromeClient:GetOnCreateWindow_Landroid_webkit_WebView_ZZLandroid_os_Message_Handler ()\n\tSystem.Delegate Android.Webkit.WebMessagePort/WebMessageCallback:GetOnMessage_Landroid_webkit_WebMessagePort_Landroid_webkit_WebMessage_Handler ()\n\tSystem.Delegate Android.Webkit.WebViewClient:GetOnPageFinished_Landroid_webkit_WebView_Ljava_lang_String_Handler ()\n\tSystem.Delegate Android.Webkit.WebViewClient:GetShouldInterceptRequest_Landroid_webkit_WebView_Landroid_webkit_WebResourceRequest_Handler ()\n\tSystem.Delegate Android.Webkit.WebViewClient:GetShouldOverrideUrlLoading_Landroid_webkit_WebView_Landroid_webkit_WebResourceRequest_Handler ()\n\tSystem.Delegate Java.Interop.TypeManager:GetActivateHandler ()\n\tSystem.Delegate Java.Interop.TypeManager/JavaTypeManager:GetActivateHandler ()\n\tSystem.Delegate Java.IO.InputStream:GetCloseHandler ()\n\tSystem.Delegate Java.IO.InputStream:GetRead_arrayBHandler ()\n\tSystem.Delegate Java.IO.InputStream:GetRead_arrayBIIHandler ()\n\tSystem.Delegate Java.IO.InputStream:GetReadHandler ()\n\tSystem.Delegate Java.Lang.IRunnableInvoker:GetRunHandler ()\n\tSystem.Delegate System.Delegate:Combine (System.Delegate,System.Delegate)\n\tSystem.Delegate System.Delegate:CreateDelegate (System.Type,object,System.Reflection.MethodInfo,bool,bool)\n\tSystem.Delegate System.Delegate:CreateDelegate (System.Type,object,System.Reflection.MethodInfo,bool)\n\tSystem.Delegate System.Delegate:CreateDelegate (System.Type,object,System.Reflection.MethodInfo)\n\tSystem.Delegate System.Delegate:CreateDelegate (System.Type,System.Reflection.MethodInfo,bool)\n\tSystem.Delegate System.Delegate:CreateDelegate (System.Type,System.Reflection.MethodInfo)\n\tSystem.Delegate System.Delegate:CreateDelegate (System.Type,System.Type,string,bool,bool)\n\tSystem.Delegate System.Delegate:CreateDelegate (System.Type,System.Type,string)\n\tSystem.Delegate System.Delegate:CreateDelegate_internal (System.Runtime.CompilerServices.QCallTypeHandle,object,System.Reflection.MethodInfo,bool)\n\tSystem.Delegate System.MulticastDelegate:CombineImpl (System.Delegate)\n\tSystem.Delegate System.Reflection.Emit.DynamicMethod:CreateDelegate (System.Type,object)\n\tSystem.Delegate System.Reflection.Emit.DynamicMethod:CreateDelegate (System.Type)\n\tSystem.Delegate System.Reflection.RuntimeMethodInfo:CreateDelegate (System.Type,object)\n\tSystem.Delegate System.Reflection.RuntimeMethodInfo:CreateDelegate (System.Type)\n\tSystem.Enum/EnumInfo System.Enum:GetEnumInfo (System.RuntimeType,bool)\n\tSystem.Exception Android.Runtime.AndroidRuntime:GetExceptionForThrowable (Java.Interop.JniObjectReference&,Java.Interop.JniObjectReferenceOptions)\n\tSystem.Exception Java.Interop.JniEnvironment:GetExceptionForLastThrowable (intptr)\n\tSystem.Exception Java.Lang.Throwable:_GetInnerException (intptr)\n\tSystem.Exception/DispatchState System.Exception:CaptureDispatchState ()\n\tSystem.Func`1<object> System.Text.Json.Serialization.Metadata.ReflectionEmitCachingMemberAccessor:CreateConstructor (System.Type)\n\tSystem.Func`1<object> System.Text.Json.Serialization.Metadata.ReflectionEmitCachingMemberAccessor/<>c:<CreateConstructor>b__5_0 (System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>)\n\tSystem.Func`1<object> System.Text.Json.Serialization.Metadata.ReflectionEmitCachingMemberAccessor/Cache`1<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>:GetOrAdd (System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>,System.Func`2<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>, System.Func`1<object>>)\n\tSystem.Func`1<object> System.Text.Json.Serialization.Metadata.ReflectionEmitMemberAccessor:CreateConstructor (System.Type)\n\tSystem.Func`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope, object> Microsoft.Extensions.DependencyInjection.ServiceLookup.CompiledServiceProviderEngine:RealizeService (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite)\n\tSystem.Func`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope, object> Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine:<>n__0 (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite)\n\tSystem.Func`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope, object> Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine:RealizeService (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite)\n\tSystem.Func`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope, object> Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder:Build (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite)\n\tSystem.Func`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope, object> Microsoft.Extensions.DependencyInjection.ServiceProvider:CreateServiceAccessor (System.Type)\n\tSystem.Func`2<object, intptr> Java.Interop.JavaConvert:GetLocalJniHandleConverter (object)\n\tSystem.Func`4<System.Type, intptr, int, System.Array> Android.Runtime.JNIEnv:GetConverter (System.Collections.Generic.Dictionary`2<System.Type, System.Func`4<System.Type, intptr, int, System.Array>>,System.Type,intptr)\n\tSystem.GCMemoryInfo System.GC:GetGCMemoryInfo ()\n\tSystem.Globalization.CalendarData System.Globalization.CalendarData:CreateInvariant ()\n\tSystem.Globalization.CompareInfo System.Globalization.CultureInfo:get_CompareInfo ()\n\tSystem.Globalization.CultureData System.Globalization.CultureData:CreateCultureWithInvariantData ()\n\tSystem.Globalization.CultureData System.Globalization.CultureData:get_Invariant ()\n\tSystem.Globalization.CultureInfo System.Globalization.CultureInfo:get_InvariantCulture ()\n\tSystem.Guid System.Reflection.RuntimeModule:get_ModuleVersionId ()\n\tSystem.Guid System.Reflection.RuntimeModule:GetModuleVersionId ()\n\tSystem.IDisposable Microsoft.Extensions.Options.OptionsMonitor`1<Microsoft.Extensions.Logging.LoggerFilterOptions>:OnChange (System.Action`2<Microsoft.Extensions.Logging.LoggerFilterOptions, string>)\n\tSystem.IDisposable Microsoft.Extensions.Options.OptionsMonitorExtensions:OnChange (Microsoft.Extensions.Options.IOptionsMonitor`1<Microsoft.Extensions.Logging.LoggerFilterOptions>,System.Action`1<Microsoft.Extensions.Logging.LoggerFilterOptions>)\n\tSystem.IDisposable& System.Collections.Generic.Dictionary`2<System.IntPtr, System.IDisposable>:FindValue (intptr)\n\tSystem.IO.Stream Android.Content.Res.AssetManager:Open (string)\n\tSystem.IO.Stream Android.Runtime.InputStreamInvoker:FromJniHandle (intptr,Android.Runtime.JniHandleOwnership)\n\tSystem.IO.Stream Microsoft.AspNetCore.Components.WebView.Maui.AndroidAssetFileProvider/AndroidMauiAssetFileInfo:CreateReadStream ()\n\tSystem.IO.Stream Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestFileInfo:CreateReadStream ()\n\tSystem.IO.Stream Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestFileInfo:GetManifestResourceStream ()\n\tSystem.IO.Stream System.IO.BinaryWriter:get_BaseStream ()\n\tSystem.IO.Stream System.Reflection.RuntimeAssembly:GetManifestResourceStream (string)\n\tSystem.IServiceProvider Microsoft.Extensions.DependencyInjection.AsyncServiceScope:get_ServiceProvider ()\n\tSystem.IServiceProvider Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope:get_ServiceProvider ()\n\tSystem.Lazy`1<Microsoft.Extensions.Logging.LoggerFilterOptions> Microsoft.Extensions.Options.OptionsCache`1/<>c__3`1<Microsoft.Extensions.Logging.LoggerFilterOptions, Microsoft.Extensions.Options.IOptionsFactory`1<Microsoft.Extensions.Logging.LoggerFilterOptions>>:<GetOrAdd>b__3_0 (string,System.ValueTuple`2<System.Func`3<string, Microsoft.Extensions.Options.IOptionsFactory`1<Microsoft.Extensions.Logging.LoggerFilterOptions>, Microsoft.Extensions.Logging.LoggerFilterOptions>, Microsoft.Extensions.Options.IOptionsFactory`1<Microsoft.Extensions.Logging.LoggerFilterOptions>>)\n\tSystem.Lazy`1<Microsoft.Extensions.Logging.LoggerFilterOptions> System.Collections.Concurrent.ConcurrentDictionary`2<System.String, System.Lazy`1<Microsoft.Extensions.Logging.LoggerFilterOptions>>:GetOrAdd (string,System.Func`3<string, System.ValueTuple`2<System.Func`3<string, Microsoft.Extensions.Options.IOptionsFactory`1<Microsoft.Extensions.Logging.LoggerFilterOptions>, Microsoft.Extensions.Logging.LoggerFilterOptions>, Microsoft.Extensions.Options.IOptionsFactory`1<Microsoft.Extensions.Logging.LoggerFilterOptions>>, System.Lazy`1<Microsoft.Extensions.Logging.LoggerFilterOptions>>,System.ValueTuple`2<System.Func`3<string, Microsoft.Extensions.Options.IOptionsFactory`1<Microsoft.Extensions.Logging.LoggerFilterOptions>, Microsoft.Extensions.Logging.LoggerFilterOptions>, Microsoft.Extensions.Options.IOptionsFactory`1<Microsoft.Extensions.Logging.LoggerFilterOptions>>)\n\tSystem.LazyHelper System.LazyHelper:Create (System.Threading.LazyThreadSafetyMode,bool)\n\tSystem.Memory`1<byte> System.MemoryExtensions:AsMemory (byte[],int,int)\n\tSystem.Memory`1<byte> System.MemoryExtensions:AsMemory (byte[],int)\n\tSystem.Memory`1<byte> System.Text.Json.PooledByteBufferWriter:GetMemory (int)\n\tSystem.MulticastDelegate System.Delegate:AllocDelegateLike_internal (System.Delegate)\n\tSystem.Nullable`1<Java.Interop.JniRuntime/ReplacementMethodInfo> Android.Runtime.AndroidTypeManager:GetReplacementMethodInfoCore (string,string,string)\n\tSystem.Nullable`1<Java.Interop.JniRuntime/ReplacementMethodInfo> Java.Interop.JniRuntime/JniTypeManager:GetReplacementMethodInfo (string,string,string)\n\tSystem.Nullable`1<System.Text.Json.Serialization.JsonNumberHandling> System.Text.Json.Serialization.Metadata.ReflectionJsonTypeInfo`1<Microsoft.JSInterop.JSCallResultType>:GetNumberHandlingForType (System.Type)\n\tSystem.Nullable`1<System.Text.Json.Serialization.JsonNumberHandling> System.Text.Json.Serialization.Metadata.ReflectionJsonTypeInfo`1<System.Int32>:GetNumberHandlingForType (System.Type)\n\tSystem.Nullable`1<System.Text.Json.Serialization.JsonNumberHandling> System.Text.Json.Serialization.Metadata.ReflectionJsonTypeInfo`1<System.Int64>:GetNumberHandlingForType (System.Type)\n\tSystem.Nullable`1<System.Text.Json.Serialization.JsonNumberHandling> System.Text.Json.Serialization.Metadata.ReflectionJsonTypeInfo`1<System.Text.Json.JsonElement>:GetNumberHandlingForType (System.Type)\n\tSystem.ParsingError System.Uri:CheckSchemeSyntax (System.ReadOnlySpan`1<char>,System.UriParser&)\n\tSystem.ParsingError System.Uri:ParseScheme (string,System.Uri/Flags&,System.UriParser&)\n\tSystem.ParsingError System.Uri:PrivateParseMinimal ()\n\tSystem.ReadOnlyMemory`1<byte> System.Text.Json.PooledByteBufferWriter:get_WrittenMemory ()\n\tSystem.ReadOnlySpan`1<byte> System.Buffers.Text.Base64:get_EncodingMap ()\n\tSystem.ReadOnlySpan`1<byte> System.Char:get_Latin1CharInfo ()\n\tSystem.ReadOnlySpan`1<byte> System.Numerics.BitOperations:get_Log2DeBruijn ()\n\tSystem.ReadOnlySpan`1<byte> System.Text.Json.JsonConstants:get_Delimiters ()\n\tSystem.ReadOnlySpan`1<byte> System.Text.Json.JsonConstants:get_NullValue ()\n\tSystem.ReadOnlySpan`1<byte> System.Text.Json.JsonConstants:get_TrueValue ()\n\tSystem.ReadOnlySpan`1<byte> System.Text.Json.JsonWriterHelper:get_AllowList ()\n\tSystem.ReadOnlySpan`1<byte> System.Text.Json.Utf8JsonReader:get_OriginalSpan ()\n\tSystem.ReadOnlySpan`1<byte> System.Text.Unicode.UnicodeHelpers:get_DefinedCharsBitmapSpan ()\n\tSystem.ReadOnlySpan`1<byte> System.Text.Unicode.UnicodeHelpers:GetDefinedBmpCodePointsBitmapLittleEndian ()\n\tSystem.ReadOnlySpan`1<byte> System.Text.UTF8Encoding:get_Preamble ()\n\tSystem.ReadOnlySpan`1<byte> System.Text.UTF8Encoding:get_PreambleSpan ()\n\tSystem.ReadOnlySpan`1<byte> System.Xml.XmlCharType:get_CharProperties ()\n\tSystem.ReadOnlySpan`1<char> Microsoft.Extensions.Primitives.StringSegment:AsSpan ()\n\tSystem.ReadOnlySpan`1<char> System.IO.Path:GetFileName (System.ReadOnlySpan`1<char>)\n\tSystem.ReadOnlySpan`1<char> System.IO.Path:GetPathRoot (System.ReadOnlySpan`1<char>)\n\tSystem.ReadOnlySpan`1<char> System.IO.Path:TrimEndingDirectorySeparator (System.ReadOnlySpan`1<char>)\n\tSystem.ReadOnlySpan`1<char> System.IO.PathInternal:TrimEndingDirectorySeparator (System.ReadOnlySpan`1<char>)\n\tSystem.ReadOnlySpan`1<char> System.MemoryExtensions:Trim (System.ReadOnlySpan`1<char>)\n\tSystem.ReadOnlySpan`1<char> System.MemoryExtensions:TrimStart (System.ReadOnlySpan`1<char>)\n\tSystem.ReadOnlySpan`1<char> System.Runtime.CompilerServices.DefaultInterpolatedStringHandler:get_Text ()\n\tSystem.Reflection.Assembly System.Reflection.Assembly:GetEntryAssembly ()\n\tSystem.Reflection.Assembly System.Reflection.Assembly:GetEntryAssemblyInternal ()\n\tSystem.Reflection.Assembly System.Reflection.Assembly:GetEntryAssemblyNative ()\n\tSystem.Reflection.Assembly System.RuntimeType:get_Assembly ()\n\tSystem.Reflection.Assembly System.Text.Json.Serialization.Metadata.FSharpCoreReflectionProxy:GetFSharpCoreAssembly (System.Type)\n\tSystem.Reflection.Binder System.Type:get_DefaultBinder ()\n\tSystem.Reflection.BindingFlags System.Reflection.RuntimePropertyInfo:FilterPreCalculate (bool,bool,bool)\n\tSystem.Reflection.BindingFlags System.Reflection.RuntimePropertyInfo:get_BindingFlags ()\n\tSystem.Reflection.CallingConventions System.Reflection.MonoMethodInfo:GetCallingConvention (intptr)\n\tSystem.Reflection.CallingConventions System.Reflection.RuntimeConstructorInfo:get_CallingConvention ()\n\tSystem.Reflection.ConstructorInfo System.RuntimeType:GetConstructorImpl (System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[])\n\tSystem.Reflection.ConstructorInfo System.RuntimeType/ListBuilder`1<System.Reflection.ConstructorInfo>:get_Item (int)\n\tSystem.Reflection.ConstructorInfo System.Type:GetConstructor (System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[])\n\tSystem.Reflection.ConstructorInfo System.Type:GetConstructor (System.Reflection.BindingFlags,System.Reflection.Binder,System.Type[],System.Reflection.ParameterModifier[])\n\tSystem.Reflection.ConstructorInfo System.Type:GetConstructor (System.Type[])\n\tSystem.Reflection.ConstructorInfo[] System.RuntimeType:GetConstructors (System.Reflection.BindingFlags)\n\tSystem.Reflection.ConstructorInfo[] System.RuntimeType/ListBuilder`1<System.Reflection.ConstructorInfo>:ToArray ()\n\tSystem.Reflection.ConstructorInfo[] System.Type:GetConstructors ()\n\tSystem.Reflection.CorElementType System.Enum:InternalGetCorElementType ()\n\tSystem.Reflection.CorElementType System.Enum:InternalGetCorElementType (System.Runtime.CompilerServices.QCallTypeHandle)\n\tSystem.Reflection.CorElementType System.RuntimeTypeHandle:GetCorElementType (System.Runtime.CompilerServices.QCallTypeHandle)\n\tSystem.Reflection.CorElementType System.RuntimeTypeHandle:GetCorElementType (System.RuntimeType)\n\tSystem.Reflection.Emit.ILGenerator System.Reflection.Emit.DynamicMethod:GetILGenerator ()\n\tSystem.Reflection.Emit.ILGenerator System.Reflection.Emit.DynamicMethod:GetILGenerator (int)\n\tSystem.Reflection.Emit.Label System.Reflection.Emit.ILGenerator:BeginExceptionBlock ()\n\tSystem.Reflection.Emit.Label System.Reflection.Emit.ILGenerator:DefineLabel ()\n\tSystem.Reflection.Emit.LocalBuilder System.Reflection.Emit.ILGenerator:DeclareLocal (System.Type,bool)\n\tSystem.Reflection.Emit.LocalBuilder System.Reflection.Emit.ILGenerator:DeclareLocal (System.Type)\n\tSystem.Reflection.FieldInfo System.Reflection.FieldInfo:GetFieldFromHandle (System.RuntimeFieldHandle,System.RuntimeTypeHandle)\n\tSystem.Reflection.FieldInfo System.Reflection.FieldInfo:internal_from_handle_type (intptr,intptr)\n\tSystem.Reflection.FieldInfo System.RuntimeType:GetField (string,System.Reflection.BindingFlags)\n\tSystem.Reflection.FieldInfo System.Type:GetField (string)\n\tSystem.Reflection.FieldInfo[] System.RuntimeType:GetFields (System.Reflection.BindingFlags)\n\tSystem.Reflection.ICustomAttributeProvider System.Reflection.CustomAttribute:GetBase (System.Reflection.ICustomAttributeProvider)\n\tSystem.Reflection.InvocationFlags System.Reflection.RuntimeConstructorInfo:ComputeAndUpdateInvocationFlags (System.Reflection.ConstructorInfo,System.Reflection.InvocationFlags&)\n\tSystem.Reflection.MethodAttributes System.Reflection.Emit.DynamicMethod:get_Attributes ()\n\tSystem.Reflection.MethodAttributes System.Reflection.MonoMethodInfo:GetAttributes (intptr)\n\tSystem.Reflection.MethodAttributes System.Reflection.RuntimeConstructorInfo:get_Attributes ()\n\tSystem.Reflection.MethodAttributes System.Reflection.RuntimeMethodInfo:get_Attributes ()\n\tSystem.Reflection.MethodBase System.DefaultBinder:BindToMethod (System.Reflection.BindingFlags,System.Reflection.MethodBase[],object[]&,System.Reflection.ParameterModifier[],System.Globalization.CultureInfo,string[],object&)\n\tSystem.Reflection.MethodBase System.DefaultBinder:SelectMethod (System.Reflection.BindingFlags,System.Reflection.MethodBase[],System.Type[],System.Reflection.ParameterModifier[])\n\tSystem.Reflection.MethodBase System.Reflection.RuntimeMethodInfo:GetMethodFromHandleInternalType_native (intptr,intptr,bool)\n\tSystem.Reflection.MethodBase System.Reflection.RuntimeMethodInfo:GetMethodFromHandleNoGenericCheck (System.RuntimeMethodHandle,System.RuntimeTypeHandle)\n\tSystem.Reflection.MethodBase System.Reflection.RuntimeMethodInfo:GetMethodFromHandleNoGenericCheck (System.RuntimeMethodHandle)\n\tSystem.Reflection.MethodImplAttributes System.Reflection.Emit.DynamicMethod:GetMethodImplementationFlags ()\n\tSystem.Reflection.MethodInfo System.Delegate:get_Method ()\n\tSystem.Reflection.MethodInfo System.Delegate:GetCandidateMethod (System.RuntimeType,System.Type,string,System.Reflection.BindingFlags,bool)\n\tSystem.Reflection.MethodInfo System.Delegate:GetDelegateInvokeMethod (System.RuntimeType)\n\tSystem.Reflection.MethodInfo System.Delegate:GetMethodImpl ()\n\tSystem.Reflection.MethodInfo System.MulticastDelegate:GetMethodImpl ()\n\tSystem.Reflection.MethodInfo System.Reflection.PropertyInfo:get_GetMethod ()\n\tSystem.Reflection.MethodInfo System.Reflection.PropertyInfo:get_SetMethod ()\n\tSystem.Reflection.MethodInfo System.Reflection.RuntimeMethodInfo:MakeGenericMethod (System.Type[])\n\tSystem.Reflection.MethodInfo System.Reflection.RuntimeMethodInfo:MakeGenericMethod_impl (System.Type[])\n\tSystem.Reflection.MethodInfo System.Reflection.RuntimePropertyInfo:GetGetMethod (bool)\n\tSystem.Reflection.MethodInfo System.Reflection.RuntimePropertyInfo:GetSetMethod (bool)\n\tSystem.Reflection.MethodInfo System.RuntimeType:GetMethodImpl (string,int,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[])\n\tSystem.Reflection.MethodInfo System.RuntimeType:GetMethodImpl (string,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[])\n\tSystem.Reflection.MethodInfo System.Type:GetMethod (string,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[])\n\tSystem.Reflection.MethodInfo System.Type:GetMethod (string,System.Reflection.BindingFlags,System.Reflection.Binder,System.Type[],System.Reflection.ParameterModifier[])\n\tSystem.Reflection.MethodInfo System.Type:GetMethod (string,System.Reflection.BindingFlags)\n\tSystem.Reflection.MethodInfo System.Type:GetMethod (string)\n\tSystem.Reflection.Module System.Reflection.Emit.DynamicMethod:get_Module ()\n\tSystem.Reflection.Module System.RuntimeType:get_Module ()\n\tSystem.Reflection.MonoMethodInfo System.Reflection.MonoMethodInfo:GetMethodInfo (intptr)\n\tSystem.Reflection.ParameterInfo System.Reflection.RuntimeParameterInfo:New (System.Reflection.Emit.ParameterBuilder,System.Type,System.Reflection.MemberInfo,int)\n\tSystem.Reflection.ParameterInfo[] System.Reflection.Emit.DynamicMethod:GetParametersInternal ()\n\tSystem.Reflection.ParameterInfo[] System.Reflection.MethodBase:GetParametersNoCopy ()\n\tSystem.Reflection.ParameterInfo[] System.Reflection.MonoMethodInfo:get_parameter_info (intptr,System.Reflection.MemberInfo)\n\tSystem.Reflection.ParameterInfo[] System.Reflection.MonoMethodInfo:GetParametersInfo (intptr,System.Reflection.MemberInfo)\n\tSystem.Reflection.ParameterInfo[] System.Reflection.RuntimeConstructorInfo:GetParameters ()\n\tSystem.Reflection.ParameterInfo[] System.Reflection.RuntimeConstructorInfo:GetParametersInternal ()\n\tSystem.Reflection.ParameterInfo[] System.Reflection.RuntimeMethodInfo:GetParametersInternal ()\n\tSystem.Reflection.PropertyInfo Microsoft.AspNetCore.Components.Reflection.MemberAssignment/<GetPropertiesIncludingInherited>d__0:System.Collections.Generic.IEnumerator<System.Reflection.PropertyInfo>.get_Current ()\n\tSystem.Reflection.PropertyInfo System.Reflection.CustomAttribute:GetBasePropertyDefinition (System.Reflection.RuntimePropertyInfo)\n\tSystem.Reflection.PropertyInfo System.Reflection.RuntimePropertyInfo:GetPropertyFromHandle (Mono.RuntimePropertyHandle,System.RuntimeTypeHandle)\n\tSystem.Reflection.PropertyInfo System.Reflection.RuntimePropertyInfo:internal_from_handle_type (intptr,intptr)\n\tSystem.Reflection.PropertyInfo System.RuntimeType:GetPropertyImpl (string,System.Reflection.BindingFlags,System.Reflection.Binder,System.Type,System.Type[],System.Reflection.ParameterModifier[])\n\tSystem.Reflection.PropertyInfo System.Type:GetProperty (string,System.Reflection.BindingFlags)\n\tSystem.Reflection.PropertyInfo[] System.RuntimeType:GetProperties (System.Reflection.BindingFlags)\n\tSystem.Reflection.RuntimeAssembly System.RuntimeTypeHandle:GetAssembly (System.RuntimeType)\n\tSystem.Reflection.RuntimeConstructorInfo System.RuntimeType:GetDefaultConstructor ()\n\tSystem.Reflection.RuntimeConstructorInfo[] System.RuntimeType:GetConstructors_internal (System.Reflection.BindingFlags,System.RuntimeType)\n\tSystem.Reflection.RuntimeFieldInfo[] System.RuntimeType:GetFields_internal (string,System.Reflection.BindingFlags,System.RuntimeType/MemberListType,System.RuntimeType)\n\tSystem.Reflection.RuntimeMethodInfo[] System.RuntimeType:GetMethodsByName (string,System.Reflection.BindingFlags,System.RuntimeType/MemberListType,System.RuntimeType)\n\tSystem.Reflection.RuntimeModule System.RuntimeType:GetRuntimeModule ()\n\tSystem.Reflection.RuntimeModule System.RuntimeTypeHandle:GetModule (System.RuntimeType)\n\tSystem.Reflection.RuntimePropertyInfo[] System.RuntimeType:GetPropertiesByName (string,System.Reflection.BindingFlags,System.RuntimeType/MemberListType,System.RuntimeType)\n\tSystem.Reflection.TypeAttributes System.RuntimeType:GetAttributeFlagsImpl ()\n\tSystem.Reflection.TypeAttributes System.RuntimeTypeHandle:GetAttributes (System.Runtime.CompilerServices.QCallTypeHandle)\n\tSystem.Reflection.TypeAttributes System.RuntimeTypeHandle:GetAttributes (System.RuntimeType)\n\tSystem.Reflection.TypeAttributes System.Type:get_Attributes ()\n\tSystem.Runtime.CompilerServices.AsyncValueTaskMethodBuilder System.Runtime.CompilerServices.AsyncValueTaskMethodBuilder:Create ()\n\tSystem.Runtime.CompilerServices.AsyncValueTaskMethodBuilder`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult> System.Runtime.CompilerServices.AsyncValueTaskMethodBuilder`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>:Create ()\n\tSystem.Runtime.CompilerServices.AsyncVoidMethodBuilder System.Runtime.CompilerServices.AsyncVoidMethodBuilder:Create ()\n\tSystem.Runtime.CompilerServices.ConditionalWeakTable`2<System.Text.Json.JsonSerializerOptions, object> System.Text.Json.JsonSerializerOptions/TrackedOptionsInstances:get_All ()\n\tSystem.Runtime.CompilerServices.IAsyncStateMachineBox System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>:GetStateMachineBox (Microsoft.JSInterop.JSRuntime/<InvokeAsync>d__16`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>&,System.Threading.Tasks.Task`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>&)\n\tSystem.Runtime.CompilerServices.IAsyncStateMachineBox System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<System.Threading.Tasks.VoidTaskResult>:GetStateMachineBox (Microsoft.AspNetCore.Components.RenderTree.Renderer/<GetErrorHandledTask>d__71&,System.Threading.Tasks.Task`1<System.Threading.Tasks.VoidTaskResult>&)\n\tSystem.Runtime.CompilerServices.IAsyncStateMachineBox System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<System.Threading.Tasks.VoidTaskResult>:GetStateMachineBox (Microsoft.AspNetCore.Components.RenderTree.Renderer/<InvokeRenderCompletedCallsAfterUpdateDisplayTask>d__66&,System.Threading.Tasks.Task`1<System.Threading.Tasks.VoidTaskResult>&)\n\tSystem.Runtime.CompilerServices.IAsyncStateMachineBox System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<System.Threading.Tasks.VoidTaskResult>:GetStateMachineBox (Microsoft.AspNetCore.Components.Routing.FocusOnNavigate/<OnAfterRenderAsync>d__15&,System.Threading.Tasks.Task`1<System.Threading.Tasks.VoidTaskResult>&)\n\tSystem.Runtime.CompilerServices.IAsyncStateMachineBox System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<System.Threading.Tasks.VoidTaskResult>:GetStateMachineBox (Microsoft.AspNetCore.Components.WebView.IpcSender/<>c__DisplayClass13_0/<<NotifyErrors>g__AwaitAndNotify|0>d&,System.Threading.Tasks.Task`1<System.Threading.Tasks.VoidTaskResult>&)\n\tSystem.Runtime.CompilerServices.IAsyncStateMachineBox System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<System.Threading.Tasks.VoidTaskResult>:GetStateMachineBox (Microsoft.JSInterop.JSRuntimeExtensions/<InvokeVoidAsync>d__0&,System.Threading.Tasks.Task`1<System.Threading.Tasks.VoidTaskResult>&)\n\tSystem.Runtime.CompilerServices.TaskAwaiter`1<System.Threading.Tasks.Task> System.Threading.Tasks.Task`1<System.Threading.Tasks.Task>:GetAwaiter ()\n\tSystem.Runtime.ExceptionServices.ExceptionDispatchInfo System.Runtime.ExceptionServices.ExceptionDispatchInfo:Capture (System.Exception)\n\tSystem.Runtime.InteropServices.GCHandle System.Runtime.InteropServices.GCHandle:Alloc (object,System.Runtime.InteropServices.GCHandleType)\n\tSystem.RuntimeType System.Enum:InternalGetUnderlyingType (System.RuntimeType)\n\tSystem.RuntimeType System.Enum:ValidateRuntimeType (System.Type)\n\tSystem.RuntimeType System.RuntimeType:GetBaseType ()\n\tSystem.RuntimeType System.RuntimeType:GetType (string,bool,bool,System.Threading.StackCrawlMark&)\n\tSystem.RuntimeType System.RuntimeTypeHandle:GetBaseType (System.RuntimeType)\n\tSystem.RuntimeType System.RuntimeTypeHandle:GetElementType (System.RuntimeType)\n\tSystem.RuntimeType System.RuntimeTypeHandle:GetTypeByName (string,bool,bool,System.Threading.StackCrawlMark&)\n\tSystem.RuntimeType[] System.Reflection.RuntimeConstructorInfo:get_ArgumentTypes ()\n\tSystem.RuntimeType[] System.RuntimeType:GetGenericArgumentsInternal ()\n\tSystem.RuntimeType/CheckValueStatus System.RuntimeType:TryConvertToType (object&)\n\tSystem.RuntimeType/ListBuilder`1<System.Reflection.ConstructorInfo> System.RuntimeType:GetConstructorCandidates (string,System.Reflection.BindingFlags,System.Reflection.CallingConventions,System.Type[],bool)\n\tSystem.RuntimeType/ListBuilder`1<System.Reflection.FieldInfo> System.RuntimeType:GetFieldCandidates (string,System.Reflection.BindingFlags,bool)\n\tSystem.RuntimeType/ListBuilder`1<System.Reflection.MethodInfo> System.RuntimeType:GetMethodCandidates (string,System.Reflection.BindingFlags,System.Reflection.CallingConventions,System.Type[],int,bool)\n\tSystem.RuntimeType/ListBuilder`1<System.Reflection.PropertyInfo> System.RuntimeType:GetPropertyCandidates (string,System.Reflection.BindingFlags,System.Type[],bool)\n\tSystem.RuntimeType/TypeCache System.RuntimeType:get_Cache ()\n\tSystem.RuntimeTypeHandle System.RuntimeType:get_TypeHandle ()\n\tSystem.Span`1<byte> System.Text.ValueUtf8Converter:ConvertAndTerminateString (System.ReadOnlySpan`1<char>)\n\tSystem.Text.CodePageDataItem System.Text.EncodingTable:GetCodePageDataItem (int)\n\tSystem.Text.CodePageDataItem System.Text.EncodingTable:InternalGetCodePageDataItem (int,int)\n\tSystem.Text.Decoder System.Text.UTF8Encoding:GetDecoder ()\n\tSystem.Text.DecoderFallbackBuffer System.Text.Decoder:get_FallbackBuffer ()\n\tSystem.Text.DecoderFallbackBuffer System.Text.DecoderExceptionFallback:CreateFallbackBuffer ()\n\tSystem.Text.DecoderFallbackBuffer System.Text.DecoderFallbackBuffer:CreateAndInitialize (System.Text.Encoding,System.Text.DecoderNLS,int)\n\tSystem.Text.Encoding System.Text.Encoding:get_UTF8 ()\n\tSystem.Text.Encoding System.Xml.XmlTextReaderImpl:CheckEncoding (string)\n\tSystem.Text.Encoding System.Xml.XmlTextReaderImpl:DetectEncoding ()\n\tSystem.Text.Encodings.Web.AllowedBmpCodePointsBitmap modreq System.Text.Encodings.Web.TextEncoderSettings:GetAllowedCodePointsBitmap (System.Runtime.InteropServices.InAttribute)& System.Text.Encodings.Web.TextEncoderSettings:GetAllowedCodePointsBitmap ()\n\tSystem.Text.Json.ConsumeNumberResult System.Text.Json.Utf8JsonReader:ConsumeIntegerDigits (System.ReadOnlySpan`1<byte>&,int&)\n\tSystem.Text.Json.ConsumeNumberResult System.Text.Json.Utf8JsonReader:ConsumeNegativeSign (System.ReadOnlySpan`1<byte>&,int&)\n\tSystem.Text.Json.ConsumeTokenResult System.Text.Json.Utf8JsonReader:ConsumeNextToken (byte)\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.Converters.ObjectConverter:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonCollectionConverter`2<System.Collections.IEnumerable, System.Object>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonConverter`1<Microsoft.AspNetCore.Components.ElementReference>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonConverter`1<Microsoft.JSInterop.JSCallResultType>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonConverter`1<System.Boolean>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonConverter`1<System.Byte>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonConverter`1<System.Char>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonConverter`1<System.DateOnly>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonConverter`1<System.DateTime>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonConverter`1<System.DateTimeOffset>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonConverter`1<System.Decimal>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonConverter`1<System.Double>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonConverter`1<System.Guid>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonConverter`1<System.Int16>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonConverter`1<System.Int32>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonConverter`1<System.Int64>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonConverter`1<System.SByte>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonConverter`1<System.Single>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonConverter`1<System.Text.Json.JsonElement>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonConverter`1<System.TimeOnly>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonConverter`1<System.TimeSpan>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonConverter`1<System.UInt16>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonConverter`1<System.UInt32>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonConverter`1<System.UInt64>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonDictionaryConverter`1<System.Collections.IDictionary>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.JsonObjectConverter`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>:get_ConverterStrategy ()\n\tSystem.Text.Json.ConverterStrategy System.Text.Json.Serialization.Metadata.JsonPropertyInfo:get_ConverterStrategy ()\n\tSystem.Text.Json.JsonDocument System.Text.Json.JsonDocument:<CreateForLiteral>g__Create|73_0 (byte[],System.Text.Json.JsonDocument/<>c__DisplayClass73_0&)\n\tSystem.Text.Json.JsonDocument System.Text.Json.JsonDocument:CreateForLiteral (System.Text.Json.JsonTokenType)\n\tSystem.Text.Json.JsonDocument System.Text.Json.JsonDocument:ParseUnrented (System.ReadOnlyMemory`1<byte>,System.Text.Json.JsonReaderOptions,System.Text.Json.JsonTokenType)\n\tSystem.Text.Json.JsonDocument/DbRow System.Text.Json.JsonDocument/MetadataDb:Get (int)\n\tSystem.Text.Json.JsonDocument/MetadataDb System.Text.Json.JsonDocument/MetadataDb:CreateLocked (int)\n\tSystem.Text.Json.JsonElement System.ArraySegment`1<System.Text.Json.JsonElement>:get_Item (int)\n\tSystem.Text.Json.JsonElement System.Text.Json.JsonElement:ParseValue (System.Text.Json.Utf8JsonReader&)\n\tSystem.Text.Json.JsonElement System.Text.Json.Serialization.Converters.JsonElementConverter:Read (System.Text.Json.Utf8JsonReader&,System.Type,System.Text.Json.JsonSerializerOptions)\n\tSystem.Text.Json.JsonElement[] System.Collections.Generic.List`1<System.Text.Json.JsonElement>:ToArray ()\n\tSystem.Text.Json.JsonEncodedText System.Text.Json.JsonEncodedText:Encode (string,System.Text.Encodings.Web.JavaScriptEncoder)\n\tSystem.Text.Json.JsonEncodedText System.Text.Json.JsonEncodedText:Encode (System.ReadOnlySpan`1<char>,System.Text.Encodings.Web.JavaScriptEncoder)\n\tSystem.Text.Json.JsonEncodedText System.Text.Json.JsonEncodedText:EncodeHelper (System.ReadOnlySpan`1<byte>,System.Text.Encodings.Web.JavaScriptEncoder)\n\tSystem.Text.Json.JsonEncodedText System.Text.Json.JsonEncodedText:TranscodeAndEncode (System.ReadOnlySpan`1<char>,System.Text.Encodings.Web.JavaScriptEncoder)\n\tSystem.Text.Json.JsonNamingPolicy System.Text.Json.JsonNamingPolicy:get_CamelCase ()\n\tSystem.Text.Json.JsonPropertyDictionary`1<System.Text.Json.Serialization.Metadata.JsonPropertyInfo> System.Text.Json.Serialization.Metadata.JsonTypeInfo:CreatePropertyCache (int)\n\tSystem.Text.Json.JsonReaderOptions System.Text.Json.JsonSerializerOptions:GetReaderOptions ()\n\tSystem.Text.Json.JsonReaderState System.Text.Json.Utf8JsonReader:get_CurrentState ()\n\tSystem.Text.Json.JsonSerializerOptions/CachingContext System.Text.Json.JsonSerializerOptions:GetCachingContext ()\n\tSystem.Text.Json.JsonSerializerOptions/CachingContext System.Text.Json.JsonSerializerOptions/TrackedCachingContexts:GetOrCreate (System.Text.Json.JsonSerializerOptions)\n\tSystem.Text.Json.JsonWriterOptions System.Text.Json.JsonSerializerOptions:GetWriterOptions ()\n\tSystem.Text.Json.Serialization.JsonConverter Microsoft.JSInterop.Infrastructure.DotNetObjectReferenceJsonConverterFactory:CreateConverter (System.Type,System.Text.Json.JsonSerializerOptions)\n\tSystem.Text.Json.Serialization.JsonConverter System.Text.Json.JsonSerializerOptions:ExpandConverterFactory (System.Text.Json.Serialization.JsonConverter,System.Type)\n\tSystem.Text.Json.Serialization.JsonConverter System.Text.Json.JsonSerializerOptions:GetConverterFromList (System.Type)\n\tSystem.Text.Json.Serialization.JsonConverter System.Text.Json.Serialization.ConfigurationList`1<System.Text.Json.Serialization.JsonConverter>:get_Item (int)\n\tSystem.Text.Json.Serialization.JsonConverter System.Text.Json.Serialization.Converters.EnumConverterFactory:Create (System.Type,System.Text.Json.Serialization.Converters.EnumConverterOptions,System.Text.Json.JsonNamingPolicy,System.Text.Json.JsonSerializerOptions)\n\tSystem.Text.Json.Serialization.JsonConverter System.Text.Json.Serialization.Converters.EnumConverterFactory:CreateConverter (System.Type,System.Text.Json.JsonSerializerOptions)\n\tSystem.Text.Json.Serialization.JsonConverter System.Text.Json.Serialization.Converters.IEnumerableConverterFactory:CreateConverter (System.Type,System.Text.Json.JsonSerializerOptions)\n\tSystem.Text.Json.Serialization.JsonConverter System.Text.Json.Serialization.Converters.ObjectConverterFactory:CreateConverter (System.Type,System.Text.Json.JsonSerializerOptions)\n\tSystem.Text.Json.Serialization.JsonConverter System.Text.Json.Serialization.JsonConverter:ResolvePolymorphicConverter (object,System.Text.Json.Serialization.Metadata.JsonTypeInfo,System.Text.Json.JsonSerializerOptions,System.Text.Json.WriteStack&)\n\tSystem.Text.Json.Serialization.JsonConverter System.Text.Json.Serialization.JsonConverterFactory:GetConverterInternal (System.Type,System.Text.Json.JsonSerializerOptions)\n\tSystem.Text.Json.Serialization.JsonConverter System.Text.Json.Serialization.Metadata.DefaultJsonTypeInfoResolver:GetBuiltInConverter (System.Type)\n\tSystem.Text.Json.Serialization.JsonConverter System.Text.Json.Serialization.Metadata.DefaultJsonTypeInfoResolver:GetConverterForType (System.Type,System.Text.Json.JsonSerializerOptions,bool)\n\tSystem.Text.Json.Serialization.JsonConverter System.Text.Json.WriteStackFrame:InitializePolymorphicReEntry (System.Type,System.Text.Json.JsonSerializerOptions)\n\tSystem.Text.Json.Serialization.JsonConverter`1<bool> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_BooleanConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<byte[]> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_ByteArrayConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<byte> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_ByteConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<char> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_CharConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<double> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_DoubleConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<int> System.Text.Json.Serialization.JsonConverter`1<System.Int32>:CreateCastingConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<int> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_Int32Converter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<int16> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_Int16Converter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<long> System.Text.Json.Serialization.JsonConverter`1<System.Int64>:CreateCastingConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<long> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_Int64Converter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<Microsoft.JSInterop.JSCallResultType> System.Text.Json.Serialization.JsonConverter`1<Microsoft.JSInterop.JSCallResultType>:CreateCastingConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<object> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_ObjectConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<sbyte> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_SByteConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<single> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_SingleConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<string> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_StringConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<System.DateOnly> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_DateOnlyConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<System.DateTime> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_DateTimeConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<System.DateTimeOffset> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_DateTimeOffsetConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<System.Decimal> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_DecimalConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<System.Guid> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_GuidConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<System.Text.Json.JsonDocument> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_JsonDocumentConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<System.Text.Json.JsonElement> System.Text.Json.Serialization.JsonConverter`1<System.Text.Json.JsonElement>:CreateCastingConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<System.Text.Json.JsonElement> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_JsonElementConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<System.TimeOnly> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_TimeOnlyConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<System.TimeSpan> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_TimeSpanConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<System.Uri> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_UriConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<System.Version> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_VersionConverter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<uint> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_UInt32Converter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<uint16> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_UInt16Converter ()\n\tSystem.Text.Json.Serialization.JsonConverter`1<ulong> System.Text.Json.Serialization.Metadata.JsonMetadataServices:get_UInt64Converter ()\n\tSystem.Text.Json.Serialization.JsonConverterAttribute System.Text.Json.Reflection.ReflectionExtensions:GetUniqueCustomAttribute (System.Reflection.MemberInfo,bool)\n\tSystem.Text.Json.Serialization.JsonConverterFactory[] System.Text.Json.Serialization.Metadata.DefaultJsonTypeInfoResolver:GetDefaultFactoryConverters ()\n\tSystem.Text.Json.Serialization.JsonPolymorphicAttribute System.Reflection.CustomAttributeExtensions:GetCustomAttribute (System.Reflection.MemberInfo,bool)\n\tSystem.Text.Json.Serialization.Metadata.DefaultJsonTypeInfoResolver System.Text.Json.Serialization.Metadata.DefaultJsonTypeInfoResolver:RootDefaultInstance ()\n\tSystem.Text.Json.Serialization.Metadata.JsonPolymorphismOptions System.Text.Json.Serialization.Metadata.JsonPolymorphismOptions:CreateFromAttributeDeclarations (System.Type)\n\tSystem.Text.Json.Serialization.Metadata.JsonPropertyInfo System.Text.Json.Serialization.Metadata.JsonPropertyInfo:GetPropertyPlaceholder ()\n\tSystem.Text.Json.Serialization.Metadata.JsonPropertyInfo System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<Microsoft.JSInterop.JSCallResultType>:CreatePropertyInfoForTypeInfo ()\n\tSystem.Text.Json.Serialization.Metadata.JsonPropertyInfo System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<System.Int32>:CreatePropertyInfoForTypeInfo ()\n\tSystem.Text.Json.Serialization.Metadata.JsonPropertyInfo System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<System.Int64>:CreatePropertyInfoForTypeInfo ()\n\tSystem.Text.Json.Serialization.Metadata.JsonPropertyInfo System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<System.Text.Json.JsonElement>:CreatePropertyInfoForTypeInfo ()\n\tSystem.Text.Json.Serialization.Metadata.JsonTypeInfo System.Collections.Concurrent.ConcurrentDictionary`2<System.Type, System.Text.Json.Serialization.Metadata.JsonTypeInfo>:GetOrAdd (System.Type,System.Func`2<System.Type, System.Text.Json.Serialization.Metadata.JsonTypeInfo>)\n\tSystem.Text.Json.Serialization.Metadata.JsonTypeInfo System.Text.Json.JsonSerializer:GetTypeInfo (System.Text.Json.JsonSerializerOptions,System.Type)\n\tSystem.Text.Json.Serialization.Metadata.JsonTypeInfo System.Text.Json.JsonSerializer:ResolvePolymorphicTypeInfo (object[]&,System.Text.Json.Serialization.Metadata.JsonTypeInfo,bool&)\n\tSystem.Text.Json.Serialization.Metadata.JsonTypeInfo System.Text.Json.JsonSerializerOptions:GetTypeInfoInternal (System.Type,bool,bool)\n\tSystem.Text.Json.Serialization.Metadata.JsonTypeInfo System.Text.Json.JsonSerializerOptions:GetTypeInfoNoCaching (System.Type)\n\tSystem.Text.Json.Serialization.Metadata.JsonTypeInfo System.Text.Json.JsonSerializerOptions/CachingContext:GetOrAddJsonTypeInfo (System.Type)\n\tSystem.Text.Json.Serialization.Metadata.JsonTypeInfo System.Text.Json.Serialization.JsonConverter`1<Microsoft.JSInterop.JSCallResultType>:CreateReflectionJsonTypeInfo (System.Text.Json.JsonSerializerOptions)\n\tSystem.Text.Json.Serialization.Metadata.JsonTypeInfo System.Text.Json.Serialization.JsonConverter`1<System.Int32>:CreateReflectionJsonTypeInfo (System.Text.Json.JsonSerializerOptions)\n\tSystem.Text.Json.Serialization.Metadata.JsonTypeInfo System.Text.Json.Serialization.JsonConverter`1<System.Int64>:CreateReflectionJsonTypeInfo (System.Text.Json.JsonSerializerOptions)\n\tSystem.Text.Json.Serialization.Metadata.JsonTypeInfo System.Text.Json.Serialization.JsonConverter`1<System.Text.Json.JsonElement>:CreateReflectionJsonTypeInfo (System.Text.Json.JsonSerializerOptions)\n\tSystem.Text.Json.Serialization.Metadata.JsonTypeInfo System.Text.Json.Serialization.Metadata.DefaultJsonTypeInfoResolver:CreateJsonTypeInfo (System.Type,System.Text.Json.JsonSerializerOptions)\n\tSystem.Text.Json.Serialization.Metadata.JsonTypeInfo System.Text.Json.Serialization.Metadata.DefaultJsonTypeInfoResolver:GetTypeInfo (System.Type,System.Text.Json.JsonSerializerOptions)\n\tSystem.Text.Json.Serialization.Metadata.JsonTypeInfo System.Text.Json.Serialization.Metadata.JsonPropertyInfo:get_JsonTypeInfo ()\n\tSystem.Text.Json.Serialization.Metadata.JsonTypeInfo System.Text.Json.Serialization.Metadata.JsonPropertyInfo:get_ParentTypeInfo ()\n\tSystem.Text.Json.Serialization.Metadata.JsonTypeInfo System.Text.Json.Serialization.Metadata.JsonTypeInfo:get_ElementTypeInfo ()\n\tSystem.Text.Json.Serialization.Metadata.JsonTypeInfo System.Text.Json.WriteStack:PeekNestedJsonTypeInfo ()\n\tSystem.Text.Json.Serialization.Metadata.JsonTypeInfo System.Text.Json.WriteStackFrame:GetNestedJsonTypeInfo ()\n\tSystem.Text.Json.Serialization.Metadata.JsonTypeInfo`1<object[]> System.Text.Json.JsonSerializer:GetTypeInfo (System.Text.Json.JsonSerializerOptions)\n\tSystem.Text.Json.Serialization.Metadata.JsonTypeInfoKind System.Text.Json.Serialization.Metadata.JsonTypeInfo:GetTypeInfoKind (System.Type,System.Text.Json.ConverterStrategy)\n\tSystem.Text.Json.Serialization.Metadata.MemberAccessor System.Text.Json.JsonSerializerOptions:get_MemberAccessorStrategy ()\n\tSystem.Text.Json.Serialization.Metadata.ReflectionEmitCachingMemberAccessor/Cache`1/CacheEntry<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>> System.Collections.Concurrent.ConcurrentDictionary`2<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Cache`1/CacheEntry<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>>:GetOrAdd (System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>,System.Func`3<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>, System.Func`2<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>, System.Func`1<object>>, System.Text.Json.Serialization.Metadata.ReflectionEmitCachingMemberAccessor/Cache`1/CacheEntry<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>>>,System.Func`2<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>, System.Func`1<object>>)\n\tSystem.Text.Json.Serialization.Metadata.ReflectionEmitCachingMemberAccessor/Cache`1/CacheEntry<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>> System.Text.Json.Cache`1/<>c__6`1<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>, System.Func`1<System.Object>>:<GetOrAdd>b__6_0 (System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>,System.Func`2<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>, System.Func`1<object>>)\n\tSystem.Text.Json.Utf8JsonReader System.Text.Json.JsonSerializer:GetReaderScopedToNextValue (System.Text.Json.Utf8JsonReader&,System.Text.Json.ReadStack&)\n\tSystem.Text.Json.Utf8JsonWriter System.Text.Json.Utf8JsonWriter:CreateEmptyInstanceForCaching ()\n\tSystem.Text.Json.Utf8JsonWriter System.Text.Json.Utf8JsonWriterCache:RentWriterAndBuffer (System.Text.Json.JsonSerializerOptions,System.Text.Json.PooledByteBufferWriter&)\n\tSystem.Text.StringBuilder System.Text.StringBuilder:Append (char)\n\tSystem.Text.StringBuilder System.Text.StringBuilder:Append (char[],int,int)\n\tSystem.Text.StringBuilder System.Text.StringBuilder:Append (string)\n\tSystem.Text.StringBuilder System.Text.StringBuilder:Append (System.ReadOnlySpan`1<char>)\n\tSystem.Text.StringBuilder System.Text.StringBuilder:Clear ()\n\tSystem.Text.StringBuilder System.Text.StringBuilder:FindChunkForIndex (int)\n\tSystem.Text.StringBuilder System.Text.StringBuilder:Replace (char,char,int,int)\n\tSystem.Text.StringBuilder System.Text.StringBuilderCache:Acquire (int)\n\tSystem.Text.Unicode.UnicodeRange System.Text.Unicode.UnicodeRange:Create (char,char)\n\tSystem.Text.Unicode.UnicodeRange System.Text.Unicode.UnicodeRanges:CreateRange (System.Text.Unicode.UnicodeRange&,char,char)\n\tSystem.Text.Unicode.UnicodeRange System.Text.Unicode.UnicodeRanges:get_All ()\n\tSystem.Text.Unicode.UnicodeRange System.Text.Unicode.UnicodeRanges:get_BasicLatin ()\n\tSystem.Text.UTF8Encoding System.Xml.XmlTextReaderImpl:get_UTF8BomThrowing ()\n\tSystem.Threading.CancellationToken System.Threading.CancellationTokenSource:get_Token ()\n\tSystem.Threading.CancellationTokenRegistration System.Threading.CancellationToken:Register (System.Action`1<object>,object)\n\tSystem.Threading.CancellationTokenRegistration System.Threading.CancellationToken:Register (System.Delegate,object,bool,bool)\n\tSystem.Threading.CancellationTokenRegistration System.Threading.CancellationTokenSource:Register (System.Delegate,object,System.Threading.SynchronizationContext,System.Threading.ExecutionContext)\n\tSystem.Threading.ExecutionContext System.Threading.ExecutionContext:Capture ()\n\tSystem.Threading.LowLevelLifoSemaphore/Counts System.Threading.LowLevelLifoSemaphore/Counts:InterlockedCompareExchange (System.Threading.LowLevelLifoSemaphore/Counts,System.Threading.LowLevelLifoSemaphore/Counts)\n\tSystem.Threading.PortableThreadPool/ThreadCounts System.Threading.PortableThreadPool/ThreadCounts:InterlockedCompareExchange (System.Threading.PortableThreadPool/ThreadCounts,System.Threading.PortableThreadPool/ThreadCounts)\n\tSystem.Threading.SynchronizationContext Android.App.Application:get_SynchronizationContext ()\n\tSystem.Threading.SynchronizationContext System.Threading.SynchronizationContext:get_Current ()\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.ComponentBase:CallOnParametersSetAsync ()\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.ComponentBase:Microsoft.AspNetCore.Components.IHandleAfterRender.OnAfterRenderAsync ()\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.ComponentBase:OnAfterRenderAsync (bool)\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.ComponentBase:OnInitializedAsync ()\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.ComponentBase:OnParametersSetAsync ()\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.ComponentBase:RunInitAndSetParametersAsync ()\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.ComponentBase:SetParametersAsync (Microsoft.AspNetCore.Components.ParameterView)\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.EventCallback`1<Microsoft.AspNetCore.Components.Routing.NavigationContext>:InvokeAsync (Microsoft.AspNetCore.Components.Routing.NavigationContext)\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.EventCallbackWorkItem:InvokeAsync (System.MulticastDelegate,Microsoft.AspNetCore.Components.Routing.NavigationContext)\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.LayoutComponentBase:SetParametersAsync (Microsoft.AspNetCore.Components.ParameterView)\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.LayoutView:SetParametersAsync (Microsoft.AspNetCore.Components.ParameterView)\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.Rendering.ComponentState:NotifyRenderCompletedAsync ()\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.RenderTree.Renderer:<WaitForQuiescence>g__ProcessAsynchronousWork|48_0 ()\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.RenderTree.Renderer:GetErrorHandledTask (System.Threading.Tasks.Task,Microsoft.AspNetCore.Components.Rendering.ComponentState)\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.RenderTree.Renderer:InvokeRenderCompletedCalls (Microsoft.AspNetCore.Components.RenderTree.ArrayRange`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff>,System.Threading.Tasks.Task)\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.RenderTree.Renderer:InvokeRenderCompletedCallsAfterUpdateDisplayTask (System.Threading.Tasks.Task,int[])\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.RenderTree.Renderer:RenderRootComponentAsync (int,Microsoft.AspNetCore.Components.ParameterView)\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.RenderTree.Renderer:WaitForQuiescence ()\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.RouteView:SetParametersAsync (Microsoft.AspNetCore.Components.ParameterView)\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.Routing.FocusOnNavigate:OnAfterRenderAsync (bool)\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.Routing.Router:Microsoft.AspNetCore.Components.IHandleAfterRender.OnAfterRenderAsync ()\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.Routing.Router:SetParametersAsync (Microsoft.AspNetCore.Components.ParameterView)\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.WebView.IpcReceiver:OnMessageReceivedAsync (Microsoft.AspNetCore.Components.WebView.PageContext,string)\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.WebView.IpcSender/<>c__DisplayClass13_0:<NotifyErrors>g__AwaitAndNotify|0 ()\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.WebView.Services.WebViewNavigationInterception:EnableNavigationInterceptionAsync ()\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.WebView.Services.WebViewRenderer:RenderRootComponentAsync (int,Microsoft.AspNetCore.Components.ParameterView)\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.WebView.Services.WebViewRenderer:UpdateDisplayAsync (Microsoft.AspNetCore.Components.RenderTree.RenderBatch modreq Microsoft.AspNetCore.Components.WebView.Services.WebViewRenderer:UpdateDisplayAsync (System.Runtime.InteropServices.InAttribute)&)\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.WebView.WebViewManager:AddRootComponentAsync (System.Type,string,Microsoft.AspNetCore.Components.ParameterView)\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.WebView.WebViewManager:AttachToPageAsync (string,string)\n\tSystem.Threading.Tasks.Task Microsoft.AspNetCore.Components.WebView.WebViewManager/<>c__DisplayClass18_0:<MessageReceived>b__0 ()\n\tSystem.Threading.Tasks.Task Spice.RootComponent:AddToWebViewManagerAsync (Microsoft.AspNetCore.Components.WebView.WebViewManager)\n\tSystem.Threading.Tasks.Task Spice.SpiceDispatcher:InvokeAsync (System.Action)\n\tSystem.Threading.Tasks.Task Spice.SpiceDispatcher:InvokeAsync (System.Func`1<System.Threading.Tasks.Task>)\n\tSystem.Threading.Tasks.Task System.Runtime.CompilerServices.TaskAwaiter`1<System.Threading.Tasks.Task>:GetResult ()\n\tSystem.Threading.Tasks.Task System.Threading.Tasks.Task:InternalWhenAll (System.Threading.Tasks.Task[])\n\tSystem.Threading.Tasks.Task System.Threading.Tasks.Task:WhenAll (System.Collections.Generic.IEnumerable`1<System.Threading.Tasks.Task>)\n\tSystem.Threading.Tasks.Task System.Threading.Tasks.Task`1<System.Threading.Tasks.Task>:get_ResultOnSuccess ()\n\tSystem.Threading.Tasks.Task System.Threading.Tasks.ValueTask:AsTask ()\n\tSystem.Threading.Tasks.Task`1<bool> System.Threading.Tasks.TaskCache:CreateCacheableTask (bool)\n\tSystem.Threading.Tasks.Task`1<int> System.Threading.Tasks.TaskCache:CreateCacheableTask (int)\n\tSystem.Threading.Tasks.Task`1<int>[] System.Threading.Tasks.TaskCache:CreateInt32Tasks ()\n\tSystem.Threading.Tasks.Task`1<object> System.Threading.Tasks.TaskCache:CreateCacheableTask (object)\n\tSystem.Threading.Tasks.Task`1<System.Threading.Tasks.Task> System.Threading.Tasks.Task:FromResult (System.Threading.Tasks.Task)\n\tSystem.Threading.Tasks.Task`1<System.Threading.Tasks.Task> System.Threading.Tasks.Task:WhenAny (System.Threading.Tasks.Task,System.Threading.Tasks.Task)\n\tSystem.Threading.Tasks.Task`1<System.Threading.Tasks.VoidTaskResult> System.Threading.Tasks.TaskCache:CreateCacheableTask (System.Threading.Tasks.VoidTaskResult)\n\tSystem.Threading.Tasks.Task`1<System.ValueTuple`4<int, int, int, bool>> System.Threading.Tasks.Task:FromResult (System.ValueTuple`4<int, int, int, bool>)\n\tSystem.Threading.Tasks.Task`1<System.ValueTuple`4<int, int, int, bool>> System.Threading.Tasks.TaskCache:CreateCacheableTask (System.ValueTuple`4<int, int, int, bool>)\n\tSystem.Threading.Tasks.TaskStatus System.Threading.Tasks.Task:get_Status ()\n\tSystem.Threading.Tasks.ValueTask Microsoft.AspNetCore.Components.Routing.Router:RunOnNavigateAsync (string,bool)\n\tSystem.Threading.Tasks.ValueTask Microsoft.JSInterop.JSRuntimeExtensions:InvokeVoidAsync (Microsoft.JSInterop.IJSRuntime,string,object[])\n\tSystem.Threading.Tasks.ValueTask System.Runtime.CompilerServices.AsyncValueTaskMethodBuilder:get_Task ()\n\tSystem.Threading.Tasks.ValueTask System.Threading.Tasks.ValueTask:Preserve ()\n\tSystem.Threading.Tasks.ValueTask`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult> Microsoft.JSInterop.JSRuntime:InvokeAsync (long,string,object[])\n\tSystem.Threading.Tasks.ValueTask`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult> Microsoft.JSInterop.JSRuntime:InvokeAsync (long,string,System.Threading.CancellationToken,object[])\n\tSystem.Threading.Tasks.ValueTask`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult> Microsoft.JSInterop.JSRuntime:InvokeAsync (string,object[])\n\tSystem.Threading.Tasks.ValueTask`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult> System.Runtime.CompilerServices.AsyncValueTaskMethodBuilder`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>:get_Task ()\n\tSystem.Threading.Thread System.Threading.Thread:get_CurrentThread ()\n\tSystem.Threading.Thread System.Threading.Thread:GetCurrentThread ()\n\tSystem.Threading.Thread System.Threading.Thread:InitializeCurrentThread ()\n\tSystem.Threading.ThreadPoolWorkQueueThreadLocals System.Threading.ThreadPoolWorkQueue:CreateThreadLocals ()\n\tSystem.Threading.ThreadPoolWorkQueueThreadLocals System.Threading.ThreadPoolWorkQueue:GetOrCreateThreadLocals ()\n\tSystem.Threading.ThreadState System.Threading.Thread:GetState (System.Threading.Thread)\n\tSystem.Threading.ThreadState System.Threading.Thread:ValidateThreadState ()\n\tSystem.Threading.WaitSubsystem/ThreadWaitInfo System.Threading.Thread:<get_WaitInfo>g__AllocateWaitInfo|51_0 ()\n\tSystem.Threading.WaitSubsystem/ThreadWaitInfo System.Threading.Thread:get_WaitInfo ()\n\tSystem.Threading.WaitSubsystem/ThreadWaitInfo/WaitedListNode[] System.Threading.WaitSubsystem/ThreadWaitInfo:GetWaitedListNodeArray (int)\n\tSystem.Threading.WaitSubsystem/WaitableObject System.Threading.WaitSubsystem/HandleManager:FromHandle (intptr)\n\tSystem.Threading.WaitSubsystem/WaitableObject System.Threading.WaitSubsystem/WaitableObject:NewEvent (bool,System.Threading.EventResetMode)\n\tSystem.Threading.WaitSubsystem/WaitableObject[] System.Threading.WaitSubsystem/ThreadWaitInfo:GetWaitedObjectArray (int)\n\tSystem.TimeSpan System.Diagnostics.Stopwatch:GetElapsedTime (long,long)\n\tSystem.TimeSpan System.TimeSpan:FromMilliseconds (double)\n\tSystem.TimeSpan System.TimeSpan:Interval (double,double)\n\tSystem.TimeSpan System.TimeSpan:IntervalFromDoubleTicks (double)\n\tSystem.Type Android.Runtime.XAPeerMembers:GetThresholdType (Java.Interop.IJavaPeerable)\n\tSystem.Type Android.Webkit.WebMessage:get_ThresholdType ()\n\tSystem.Type Android.Webkit.WebView:get_ThresholdType ()\n\tSystem.Type Android.Webkit.WebViewClient:get_ThresholdType ()\n\tSystem.Type Android.Widget.RelativeLayout:get_ThresholdType ()\n\tSystem.Type Android.Widget.RelativeLayout/LayoutParams:get_ThresholdType ()\n\tSystem.Type AndroidX.AppCompat.App.AppCompatActivity:get_ThresholdType ()\n\tSystem.Type Java.Interop.JavaObjectExtensions:GetInvokerType (System.Type)\n\tSystem.Type Java.Interop.JniRuntime/JniTypeManager:GetUnderlyingType (System.Type,int&)\n\tSystem.Type Java.Interop.TypeManager:GetJavaToManagedType (string)\n\tSystem.Type Java.Interop.TypeManager:monodroid_typemap_java_to_managed (string)\n\tSystem.Type Java.IO.InputStreamInvoker:get_ThresholdType ()\n\tSystem.Type Java.Lang.Object:GetThresholdType ()\n\tSystem.Type Microsoft.AspNetCore.Components.LayoutView:GetParentLayoutType (System.Type)\n\tSystem.Type Microsoft.Extensions.DependencyInjection.ServiceDescriptor:GetImplementationType ()\n\tSystem.Type Microsoft.Extensions.DependencyInjection.ServiceLookup.ConstructorCallSite:get_ImplementationType ()\n\tSystem.Type Microsoft.Extensions.DependencyInjection.ServiceLookup.ConstructorCallSite:get_ServiceType ()\n\tSystem.Type Microsoft.JSInterop.Infrastructure.TaskGenericsUtil:GetTaskCompletionSourceResultType (object)\n\tSystem.Type Microsoft.JSInterop.Infrastructure.TaskGenericsUtil/TcsResultSetter`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>:get_ResultType ()\n\tSystem.Type System.Nullable:GetUnderlyingType (System.Type)\n\tSystem.Type System.Reflection.Assembly:GetType (string)\n\tSystem.Type System.Reflection.Assembly:InternalGetType (System.Reflection.Module,string,bool,bool)\n\tSystem.Type System.Reflection.Emit.DynamicMethod:get_ReturnType ()\n\tSystem.Type System.Reflection.MonoMethodInfo:GetDeclaringType (intptr)\n\tSystem.Type System.Reflection.MonoMethodInfo:GetReturnType (intptr)\n\tSystem.Type System.Reflection.ParameterInfo:get_ParameterType ()\n\tSystem.Type System.Reflection.RuntimeAssembly:GetType (string,bool,bool)\n\tSystem.Type System.Reflection.RuntimeConstructorInfo:get_DeclaringType ()\n\tSystem.Type System.Reflection.RuntimeMethodInfo:get_DeclaringType ()\n\tSystem.Type System.Reflection.RuntimeMethodInfo:get_ReturnType ()\n\tSystem.Type System.Reflection.RuntimePropertyInfo:get_DeclaringType ()\n\tSystem.Type System.Reflection.RuntimePropertyInfo:get_PropertyType ()\n\tSystem.Type System.Reflection.RuntimePropertyInfo:get_ReflectedType ()\n\tSystem.Type System.RuntimeType:get_BaseType ()\n\tSystem.Type System.RuntimeType:get_UnderlyingSystemType ()\n\tSystem.Type System.RuntimeType:GetElementType ()\n\tSystem.Type System.RuntimeType:GetGenericTypeDefinition ()\n\tSystem.Type System.RuntimeType:MakeArrayType ()\n\tSystem.Type System.RuntimeType:MakeByRefType ()\n\tSystem.Type System.RuntimeType:MakeGenericType (System.Type[])\n\tSystem.Type System.RuntimeTypeHandle:GetGenericTypeDefinition (System.RuntimeType)\n\tSystem.Type System.Text.Json.Reflection.ReflectionExtensions:GetCompatibleGenericBaseClass (System.Type,System.Type,bool)\n\tSystem.Type System.Text.Json.Reflection.ReflectionExtensions:GetCompatibleGenericInterface (System.Type,System.Type)\n\tSystem.Type System.Text.Json.Serialization.Converters.EnumConverterFactory:GetEnumConverterType (System.Type)\n\tSystem.Type System.Text.Json.Serialization.IAsyncEnumerableConverterFactory:GetAsyncEnumerableInterface (System.Type)\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<Microsoft.JSInterop.JSCallResultType>:get_ElementType ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<Microsoft.JSInterop.JSCallResultType>:get_TypeToConvert ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.Boolean>:get_TypeToConvert ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.Byte>:get_TypeToConvert ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.Char>:get_TypeToConvert ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.DateOnly>:get_TypeToConvert ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.DateTime>:get_TypeToConvert ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.DateTimeOffset>:get_TypeToConvert ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.Decimal>:get_TypeToConvert ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.Double>:get_TypeToConvert ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.Guid>:get_TypeToConvert ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.Int16>:get_TypeToConvert ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.Int32>:get_ElementType ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.Int32>:get_TypeToConvert ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.Int64>:get_ElementType ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.Int64>:get_TypeToConvert ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.Object>:get_ElementType ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.SByte>:get_TypeToConvert ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.Single>:get_TypeToConvert ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.Text.Json.JsonElement>:get_ElementType ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.Text.Json.JsonElement>:get_TypeToConvert ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.TimeOnly>:get_TypeToConvert ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.TimeSpan>:get_TypeToConvert ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.UInt16>:get_TypeToConvert ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.UInt32>:get_TypeToConvert ()\n\tSystem.Type System.Text.Json.Serialization.JsonConverter`1<System.UInt64>:get_TypeToConvert ()\n\tSystem.Type System.Text.Json.Serialization.JsonObjectConverter`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>:get_ElementType ()\n\tSystem.Type System.Type:GetRootElementType ()\n\tSystem.Type System.Type:GetType (string,bool)\n\tSystem.Type System.Type:GetType (string)\n\tSystem.Type[] Java.Interop.TypeManager:GetParameterTypes (string)\n\tSystem.Type[] System.Reflection.RuntimeAssembly:GetExportedTypes ()\n\tSystem.Type[] System.Reflection.RuntimeMethodInfo:GetGenericArguments ()\n\tSystem.Type[] System.RuntimeType:GetGenericArguments ()\n\tSystem.Type[] System.RuntimeType:GetInterfaces ()\n\tSystem.Type[] System.Type:get_GenericTypeArguments ()\n\tSystem.Type& System.Collections.Generic.Dictionary`2<System.String, System.Type>:FindValue (string)\n\tSystem.TypeCode System.RuntimeType:GetTypeCodeImpl ()\n\tSystem.TypeCode System.Type:GetTypeCode (System.Type)\n\tSystem.Uri Microsoft.AspNetCore.Components.NavigationManager:ToAbsoluteUri (string)\n\tSystem.Uri Microsoft.AspNetCore.Components.WebView.WebViewManager:EnsureTrailingSlash (System.Uri)\n\tSystem.Uri System.Uri:MakeRelativeUri (System.Uri)\n\tSystem.Uri System.Uri:ResolveHelper (System.Uri,System.Uri,string&,bool&)\n\tSystem.Uri/Check System.Uri:CheckCanonical (char*,int&,int,char)\n\tSystem.Uri/MoreInfo System.Uri/UriInfo:get_MoreInfo ()\n\tSystem.Uri/UriInfo System.Uri:EnsureUriInfo ()\n\tSystem.ValueTuple`2<int, int> System.Threading.PortableThreadPool/HillClimbing:Update (int,double,int)\n\tSystem.ValueTuple`2<Microsoft.Extensions.Logging.MessageLogger[], Microsoft.Extensions.Logging.ScopeLogger[]> Microsoft.Extensions.Logging.LoggerFactory:ApplyFilters (Microsoft.Extensions.Logging.LoggerInformation[])\n\tSystem.WeakReference`1<Java.Interop.IJavaPeerable> Android.Runtime.IdentityHashTargets:CreateWeakReference (Java.Interop.IJavaPeerable)\n\tSystem.WeakReference`1<Java.Interop.IJavaPeerable> Android.Runtime.IdentityHashTargets:get_Item (int)\n\tSystem.Xml.Linq.XAttribute System.Xml.Linq.XElement:Attribute (System.Xml.Linq.XName)\n\tSystem.Xml.Linq.XDocument System.Xml.Linq.XDocument:InitLoad (System.Xml.XmlReader,System.Xml.Linq.LoadOptions)\n\tSystem.Xml.Linq.XDocument System.Xml.Linq.XDocument:Load (System.IO.Stream,System.Xml.Linq.LoadOptions)\n\tSystem.Xml.Linq.XDocument System.Xml.Linq.XDocument:Load (System.IO.Stream)\n\tSystem.Xml.Linq.XDocument System.Xml.Linq.XDocument:Load (System.Xml.XmlReader,System.Xml.Linq.LoadOptions)\n\tSystem.Xml.Linq.XElement Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestParser:EnsureElement (System.Xml.Linq.XContainer,string)\n\tSystem.Xml.Linq.XElement System.Xml.Linq.XContainer:Element (System.Xml.Linq.XName)\n\tSystem.Xml.Linq.XElement System.Xml.Linq.XContainer/<GetElements>d__39:System.Collections.Generic.IEnumerator<System.Xml.Linq.XElement>.get_Current ()\n\tSystem.Xml.Linq.XElement System.Xml.Linq.XDocument:get_Root ()\n\tSystem.Xml.Linq.XElement System.Xml.Linq.XDocument:GetFirstNode ()\n\tSystem.Xml.Linq.XName System.Xml.Linq.XHashtable`1<System.Xml.Linq.XName>:Add (System.Xml.Linq.XName)\n\tSystem.Xml.Linq.XName System.Xml.Linq.XName:Get (string)\n\tSystem.Xml.Linq.XName System.Xml.Linq.XName:op_Implicit (string)\n\tSystem.Xml.Linq.XName System.Xml.Linq.XNamespace:GetName (string,int,int)\n\tSystem.Xml.Linq.XName System.Xml.Linq.XNamespace:GetName (string)\n\tSystem.Xml.Linq.XNamespace System.Xml.Linq.NamespaceCache:Get (string)\n\tSystem.Xml.Linq.XNamespace System.Xml.Linq.XNamespace:EnsureNamespace (System.WeakReference`1<System.Xml.Linq.XNamespace>&,string)\n\tSystem.Xml.Linq.XNamespace System.Xml.Linq.XNamespace:Get (string,int,int)\n\tSystem.Xml.Linq.XNamespace System.Xml.Linq.XNamespace:Get (string)\n\tSystem.Xml.Linq.XNamespace System.Xml.Linq.XNamespace:get_None ()\n\tSystem.Xml.Linq.XNode System.Xml.Linq.XContainer:get_FirstNode ()\n\tSystem.Xml.Linq.XNode System.Xml.Linq.XContainer:get_LastNode ()\n\tSystem.Xml.ReadState System.Xml.XmlTextReaderImpl:get_ReadState ()\n\tSystem.Xml.XmlNodeType System.Xml.Linq.XElement:get_NodeType ()\n\tSystem.Xml.XmlNodeType System.Xml.Linq.XText:get_NodeType ()\n\tSystem.Xml.XmlNodeType System.Xml.XmlTextReaderImpl:get_NodeType ()\n\tSystem.Xml.XmlNodeType System.Xml.XmlTextReaderImpl:GetTextNodeType (int)\n\tSystem.Xml.XmlReader System.Xml.XmlReader:Create (System.IO.Stream,System.Xml.XmlReaderSettings,string)\n\tSystem.Xml.XmlReader System.Xml.XmlReader:Create (System.IO.Stream,System.Xml.XmlReaderSettings)\n\tSystem.Xml.XmlReader System.Xml.XmlReaderSettings:CreateReader (System.IO.Stream,System.Uri,string,System.Xml.XmlParserContext)\n\tSystem.Xml.XmlReaderSettings System.Xml.Linq.XNode:GetXmlReaderSettings (System.Xml.Linq.LoadOptions)\n\tSystem.Xml.XmlTextReaderImpl/NodeData System.Xml.XmlTextReaderImpl:AddAttribute (int,int)\n\tSystem.Xml.XmlTextReaderImpl/NodeData System.Xml.XmlTextReaderImpl:AddAttribute (string,string,string)\n\tSystem.Xml.XmlTextReaderImpl/NodeData System.Xml.XmlTextReaderImpl:AddAttributeNoChecks (string,int)\n\tSystem.Xml.XmlTextReaderImpl/NodeData System.Xml.XmlTextReaderImpl:AddNode (int,int)\n\tSystem.Xml.XmlTextReaderImpl/NodeData System.Xml.XmlTextReaderImpl:AllocNode (int,int)\n\tSystem.Xml.XmlTextReaderImpl/NodeData System.Xml.XmlTextReaderImpl/NodeData:get_None ()\n\tuint Android.Runtime.Logger:monodroid_get_log_categories ()\n\tuint Mono.Android.<PrivateImplementationDetails>:ComputeStringHash (string)\n\tuint System.Collections.Hashtable:InitHash (object,int,uint&,uint&)\n\tuint System.HashCode:GenerateGlobalSeed ()\n\tuint System.Private.CoreLib.GateThread/DelayHelper:GetNextDelay (int)\n\tuintptr System.Text.ASCIIUtility:GetIndexOfFirstNonAsciiByte_Default (byte*,uintptr)\n\tuintptr System.Text.ASCIIUtility:GetIndexOfFirstNonAsciiChar_Default (char*,uintptr)\n\tuintptr System.Text.ASCIIUtility:NarrowUtf16ToAscii (char*,byte*,uintptr)\n\tuintptr System.Text.ASCIIUtility:WidenAsciiToUtf16 (byte*,char*,uintptr)\n\tulong System.BitConverter:DoubleToUInt64Bits (double)\n\tulong System.Collections.HashHelpers:GetFastModMultiplier (uint)\n\tulong System.Enum:ToUInt64 ()\n\tulong System.Marvin:GenerateSeed ()\n\tulong System.Marvin:get_DefaultSeed ()\n\tulong System.Private.CoreLib.Interop/Sys:GetTimestamp ()\n\tulong System.Text.Json.Serialization.Converters.EnumConverter`1<Microsoft.JSInterop.JSCallResultType>:ConvertToUInt64 (object)\n\tulong[] System.Enum:InternalGetValues (System.RuntimeType)\n\tvoid Android.App.Activity:.cctor ()\n\tvoid Android.App.Activity:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.App.Activity:n_OnCreate_Landroid_os_Bundle_ (intptr,intptr,intptr)\n\tvoid Android.App.Activity:OnCreate (Android.OS.Bundle)\n\tvoid Android.App.Activity:SetContentView (Android.Views.View)\n\tvoid Android.App.Application:.cctor ()\n\tvoid Android.Content.Context:.cctor ()\n\tvoid Android.Content.Context:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Content.ContextWrapper:.cctor ()\n\tvoid Android.Content.ContextWrapper:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Content.Res.AssetManager:.cctor ()\n\tvoid Android.Content.Res.AssetManager:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Net.Uri:.cctor ()\n\tvoid Android.Net.Uri:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Net.UriInvoker:.cctor ()\n\tvoid Android.Net.UriInvoker:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.OS.Handler:.cctor ()\n\tvoid Android.OS.Handler:.ctor (Android.OS.Looper)\n\tvoid Android.OS.Looper:.cctor ()\n\tvoid Android.OS.Looper:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Runtime.AndroidObjectReferenceManager:CreatedLocalReference (Java.Interop.JniObjectReference,int&)\n\tvoid Android.Runtime.AndroidObjectReferenceManager:DeleteGlobalReference (Java.Interop.JniObjectReference&)\n\tvoid Android.Runtime.AndroidObjectReferenceManager:DeleteLocalReference (Java.Interop.JniObjectReference&,int&)\n\tvoid Android.Runtime.AndroidRuntime:.ctor (intptr,intptr,bool,intptr,intptr,bool)\n\tvoid Android.Runtime.AndroidRuntimeOptions:.ctor (intptr,intptr,bool,intptr,intptr,bool)\n\tvoid Android.Runtime.AndroidTypeManager:.cctor ()\n\tvoid Android.Runtime.AndroidTypeManager:.ctor (bool)\n\tvoid Android.Runtime.AndroidTypeManager:RegisterNativeMembers (Java.Interop.JniType,System.Type,System.ReadOnlySpan`1<char>)\n\tvoid Android.Runtime.AndroidTypeManager:SplitMethodLine (System.ReadOnlySpan`1<char>,System.ReadOnlySpan`1<char>&,System.ReadOnlySpan`1<char>&,System.ReadOnlySpan`1<char>&,System.ReadOnlySpan`1<char>&)\n\tvoid Android.Runtime.AndroidTypeManager/MagicRegistrationMap:.cctor ()\n\tvoid Android.Runtime.AndroidTypeManager/MagicRegistrationMap:Prefill ()\n\tvoid Android.Runtime.AndroidValueManager:.ctor ()\n\tvoid Android.Runtime.AndroidValueManager:AddPeer (Java.Interop.IJavaPeerable,intptr,Android.Runtime.JniHandleOwnership,intptr&)\n\tvoid Android.Runtime.AndroidValueManager:AddPeer (Java.Interop.IJavaPeerable,Java.Interop.JniObjectReference,intptr)\n\tvoid Android.Runtime.AndroidValueManager:RemovePeer (Java.Interop.IJavaPeerable,intptr)\n\tvoid Android.Runtime.AndroidValueManager:RemovePeer (Java.Interop.IJavaPeerable)\n\tvoid Android.Runtime.IdentityHashTargets:.ctor (Java.Interop.IJavaPeerable)\n\tvoid Android.Runtime.IdentityHashTargets:RemoveAt (int)\n\tvoid Android.Runtime.InputStreamAdapter:.ctor (System.IO.Stream)\n\tvoid Android.Runtime.InputStreamAdapter:Close ()\n\tvoid Android.Runtime.InputStreamInvoker:.ctor (Java.IO.InputStream)\n\tvoid Android.Runtime.InputStreamInvoker:Close ()\n\tvoid Android.Runtime.JavaDictionary:.cctor ()\n\tvoid Android.Runtime.JavaDictionary:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Runtime.JavaDictionary`2<System.String, System.String>:.ctor ()\n\tvoid Android.Runtime.JavaDictionary`2<System.String, System.String>:.ctor (System.Collections.Generic.IDictionary`2<string, string>)\n\tvoid Android.Runtime.JavaDictionary`2<System.String, System.String>:Add (string,string)\n\tvoid Android.Runtime.JavaDictionary`2<System.String, System.String>:Put (string,string)\n\tvoid Android.Runtime.JNIEnv:_monodroid_gref_log_delete (intptr,byte,string,int,System.Text.StringBuilder,int)\n\tvoid Android.Runtime.JNIEnv:.cctor ()\n\tvoid Android.Runtime.JNIEnv:AssertCompatibleArrayTypes (intptr,System.Type)\n\tvoid Android.Runtime.JNIEnv:AssertIsJavaObject (System.Type)\n\tvoid Android.Runtime.JNIEnv:CallNonvirtualVoidMethod (intptr,intptr,intptr,Android.Runtime.JValue*)\n\tvoid Android.Runtime.JNIEnv:CheckHandle (intptr)\n\tvoid Android.Runtime.JNIEnv:CopyArray (Android.Runtime.IJavaObject[],intptr)\n\tvoid Android.Runtime.JNIEnv:CopyArray (byte[],intptr)\n\tvoid Android.Runtime.JNIEnv:CopyArray (intptr,Android.Webkit.WebMessagePort[])\n\tvoid Android.Runtime.JNIEnv:CopyArray (intptr,byte[])\n\tvoid Android.Runtime.JNIEnv:CopyArray (intptr,System.Array,System.Type)\n\tvoid Android.Runtime.JNIEnv:DeleteGlobalRef (intptr)\n\tvoid Android.Runtime.JNIEnv:DeleteLocalRef (intptr)\n\tvoid Android.Runtime.JNIEnv:DeleteRef (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Runtime.JNIEnv:FinishCreateInstance (intptr,string,Android.Runtime.JValue[])\n\tvoid Android.Runtime.JNIEnv:FinishCreateInstance (intptr,string,Android.Runtime.JValue*)\n\tvoid Android.Runtime.JNIEnv:Initialize (Android.Runtime.JnienvInitializeArgs*)\n\tvoid Android.Runtime.JNIEnv:InvokeConstructor (intptr,string,Android.Runtime.JValue*)\n\tvoid Android.Runtime.JNIEnv:monodroid_free (intptr)\n\tvoid Android.Runtime.JNIEnv:RegisterJniNatives (intptr,int,intptr,intptr,int)\n\tvoid Android.Runtime.JNIEnv:SetSynchronizationContext ()\n\tvoid Android.Runtime.JNIEnv:WaitForBridgeProcessing ()\n\tvoid Android.Runtime.JNIEnv/<>c:.cctor ()\n\tvoid Android.Runtime.JNIEnv/<>c:.ctor ()\n\tvoid Android.Runtime.JNINativeWrapper:get_runtime_types ()\n\tvoid Android.Runtime.JNINativeWrapper:Wrap_JniMarshal_PP_V (_JniMarshal_PP_V,intptr,intptr)\n\tvoid Android.Runtime.JNINativeWrapper:Wrap_JniMarshal_PPL_V (_JniMarshal_PPL_V,intptr,intptr,intptr)\n\tvoid Android.Runtime.JNINativeWrapper:Wrap_JniMarshal_PPLL_V (_JniMarshal_PPLL_V,intptr,intptr,intptr,intptr)\n\tvoid Android.Runtime.JNINativeWrapper:Wrap_JniMarshal_PPLLLL_V (_JniMarshal_PPLLLL_V,intptr,intptr,intptr,intptr,intptr,intptr)\n\tvoid Android.Runtime.JValue:.cctor ()\n\tvoid Android.Runtime.JValue:.ctor (intptr)\n\tvoid Android.Runtime.Logger:.cctor ()\n\tvoid Android.Runtime.XAPeerMembers:.cctor ()\n\tvoid Android.Runtime.XAPeerMembers:.ctor (string,System.Type)\n\tvoid Android.Views.ContextThemeWrapper:.cctor ()\n\tvoid Android.Views.ContextThemeWrapper:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Views.View:.cctor ()\n\tvoid Android.Views.View:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Views.View:set_LayoutParameters (Android.Views.ViewGroup/LayoutParams)\n\tvoid Android.Views.ViewGroup:.cctor ()\n\tvoid Android.Views.ViewGroup:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Views.ViewGroup:AddView (Android.Views.View)\n\tvoid Android.Views.ViewGroup/LayoutParams:.cctor ()\n\tvoid Android.Views.ViewGroup/LayoutParams:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Views.ViewGroup/LayoutParams:set_Height (int)\n\tvoid Android.Views.ViewGroup/LayoutParams:set_Width (int)\n\tvoid Android.Views.ViewGroup/MarginLayoutParams:.cctor ()\n\tvoid Android.Views.ViewGroup/MarginLayoutParams:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Webkit.IValueCallbackInvoker:.cctor ()\n\tvoid Android.Webkit.IValueCallbackInvoker:n_OnReceiveValue_Ljava_lang_Object_ (intptr,intptr,intptr)\n\tvoid Android.Webkit.IWebResourceRequestInvoker:.cctor ()\n\tvoid Android.Webkit.IWebResourceRequestInvoker:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Webkit.WebChromeClient:.cctor ()\n\tvoid Android.Webkit.WebChromeClient:.ctor ()\n\tvoid Android.Webkit.WebMessage:.cctor ()\n\tvoid Android.Webkit.WebMessage:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Webkit.WebMessage:.ctor (string,Android.Webkit.WebMessagePort[])\n\tvoid Android.Webkit.WebMessage:.ctor (string)\n\tvoid Android.Webkit.WebMessagePort:.cctor ()\n\tvoid Android.Webkit.WebMessagePort:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Webkit.WebMessagePort/WebMessageCallback:.cctor ()\n\tvoid Android.Webkit.WebMessagePort/WebMessageCallback:.ctor ()\n\tvoid Android.Webkit.WebMessagePort/WebMessageCallback:n_OnMessage_Landroid_webkit_WebMessagePort_Landroid_webkit_WebMessage_ (intptr,intptr,intptr,intptr)\n\tvoid Android.Webkit.WebMessagePortInvoker:.cctor ()\n\tvoid Android.Webkit.WebMessagePortInvoker:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Webkit.WebMessagePortInvoker:SetWebMessageCallback (Android.Webkit.WebMessagePort/WebMessageCallback)\n\tvoid Android.Webkit.WebResourceResponse:.cctor ()\n\tvoid Android.Webkit.WebResourceResponse:.ctor (string,string,int,string,System.Collections.Generic.IDictionary`2<string, string>,System.IO.Stream)\n\tvoid Android.Webkit.WebSettings:.cctor ()\n\tvoid Android.Webkit.WebSettings:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Webkit.WebSettingsInvoker:.cctor ()\n\tvoid Android.Webkit.WebSettingsInvoker:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Webkit.WebSettingsInvoker:set_DomStorageEnabled (bool)\n\tvoid Android.Webkit.WebSettingsInvoker:set_JavaScriptEnabled (bool)\n\tvoid Android.Webkit.WebSettingsInvoker:SetSupportMultipleWindows (bool)\n\tvoid Android.Webkit.WebView:.cctor ()\n\tvoid Android.Webkit.WebView:.ctor (Android.Content.Context)\n\tvoid Android.Webkit.WebView:EvaluateJavascript (string,Android.Webkit.IValueCallback)\n\tvoid Android.Webkit.WebView:LoadUrl (string)\n\tvoid Android.Webkit.WebView:PostWebMessage (Android.Webkit.WebMessage,Android.Net.Uri)\n\tvoid Android.Webkit.WebView:SetWebChromeClient (Android.Webkit.WebChromeClient)\n\tvoid Android.Webkit.WebView:SetWebViewClient (Android.Webkit.WebViewClient)\n\tvoid Android.Webkit.WebViewClient:.cctor ()\n\tvoid Android.Webkit.WebViewClient:.ctor ()\n\tvoid Android.Webkit.WebViewClient:n_OnPageFinished_Landroid_webkit_WebView_Ljava_lang_String_ (intptr,intptr,intptr,intptr)\n\tvoid Android.Webkit.WebViewClient:OnPageFinished (Android.Webkit.WebView,string)\n\tvoid Android.Widget.AbsoluteLayout:.cctor ()\n\tvoid Android.Widget.AbsoluteLayout:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Widget.RelativeLayout:.cctor ()\n\tvoid Android.Widget.RelativeLayout:.ctor (Android.Content.Context)\n\tvoid Android.Widget.RelativeLayout/LayoutParams:.cctor ()\n\tvoid Android.Widget.RelativeLayout/LayoutParams:.ctor (int,int)\n\tvoid Android.Widget.RelativeLayout/LayoutParams:AddRule (Android.Widget.LayoutRules)\n\tvoid AndroidX.Activity.ComponentActivity:.cctor ()\n\tvoid AndroidX.Activity.ComponentActivity:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid AndroidX.AppCompat.App.AppCompatActivity:.cctor ()\n\tvoid AndroidX.AppCompat.App.AppCompatActivity:.ctor ()\n\tvoid AndroidX.Core.App.ComponentActivity:.cctor ()\n\tvoid AndroidX.Core.App.ComponentActivity:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid AndroidX.Fragment.App.FragmentActivity:.cctor ()\n\tvoid AndroidX.Fragment.App.FragmentActivity:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid CommunityToolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangedArgs:.cctor ()\n\tvoid CommunityToolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangingArgs:.cctor ()\n\tvoid CommunityToolkit.Mvvm.ComponentModel.ObservableObject:OnPropertyChanged (System.ComponentModel.PropertyChangedEventArgs)\n\tvoid CommunityToolkit.Mvvm.ComponentModel.ObservableObject:OnPropertyChanging (System.ComponentModel.PropertyChangingEventArgs)\n\tvoid Java.Interop.JavaConvert:.cctor ()\n\tvoid Java.Interop.JavaConvert/<>c:.cctor ()\n\tvoid Java.Interop.JavaConvert/<>c:.ctor ()\n\tvoid Java.Interop.JniEnvironment:.cctor ()\n\tvoid Java.Interop.JniEnvironment:LogCreateLocalRef (intptr)\n\tvoid Java.Interop.JniEnvironment:LogCreateLocalRef (Java.Interop.JniObjectReference)\n\tvoid Java.Interop.JniEnvironment:SetEnvironmentInfo (Java.Interop.JniEnvironmentInfo)\n\tvoid Java.Interop.JniEnvironment:SetEnvironmentPointer (intptr)\n\tvoid Java.Interop.JniEnvironment/<>c:.cctor ()\n\tvoid Java.Interop.JniEnvironment/<>c:.ctor ()\n\tvoid Java.Interop.JniEnvironment/Arrays:GetByteArrayRegion (Java.Interop.JniObjectReference,int,int,sbyte*)\n\tvoid Java.Interop.JniEnvironment/Arrays:SetByteArrayRegion (Java.Interop.JniObjectReference,int,int,sbyte*)\n\tvoid Java.Interop.JniEnvironment/Arrays:SetObjectArrayElement (Java.Interop.JniObjectReference,int,Java.Interop.JniObjectReference)\n\tvoid Java.Interop.JniEnvironment/Exceptions:ExceptionClear ()\n\tvoid Java.Interop.JniEnvironment/InstanceFields:SetIntField (Java.Interop.JniObjectReference,Java.Interop.JniFieldInfo,int)\n\tvoid Java.Interop.JniEnvironment/InstanceMethods:CallNonvirtualVoidMethod (Java.Interop.JniObjectReference,Java.Interop.JniObjectReference,Java.Interop.JniMethodInfo,Java.Interop.JniArgumentValue*)\n\tvoid Java.Interop.JniEnvironment/InstanceMethods:CallVoidMethod (Java.Interop.JniObjectReference,Java.Interop.JniMethodInfo,Java.Interop.JniArgumentValue*)\n\tvoid Java.Interop.JniEnvironment/Object:.cctor ()\n\tvoid Java.Interop.JniEnvironment/References:DeleteGlobalRef (intptr)\n\tvoid Java.Interop.JniEnvironment/References:DeleteLocalRef (intptr)\n\tvoid Java.Interop.JniEnvironment/Strings:ReleaseStringChars (Java.Interop.JniObjectReference,char*)\n\tvoid Java.Interop.JniEnvironment/Types:.cctor ()\n\tvoid Java.Interop.JniEnvironment/Types:RegisterNatives (Java.Interop.JniObjectReference,Java.Interop.JniNativeMethodRegistration[],int)\n\tvoid Java.Interop.JniEnvironmentInfo:.ctor ()\n\tvoid Java.Interop.JniEnvironmentInfo:.ctor (intptr,Java.Interop.JniRuntime)\n\tvoid Java.Interop.JniEnvironmentInfo:set_EnvironmentPointer (intptr)\n\tvoid Java.Interop.JniFieldInfo:.ctor (string,string,intptr,bool)\n\tvoid Java.Interop.JniMethodInfo:.ctor (intptr,bool)\n\tvoid Java.Interop.JniMethodInfo:.ctor (string,string,intptr,bool)\n\tvoid Java.Interop.JniNativeMethodRegistration:.ctor (string,string,System.Delegate)\n\tvoid Java.Interop.JniObjectReference:Dispose (Java.Interop.JniObjectReference&,Java.Interop.JniObjectReferenceOptions)\n\tvoid Java.Interop.JniObjectReference:Dispose (Java.Interop.JniObjectReference&)\n\tvoid Java.Interop.JniObjectReference:set_Flags (Java.Interop.JniObjectReferenceFlags)\n\tvoid Java.Interop.JniPeerMembers:.ctor (string,System.Type,bool,bool)\n\tvoid Java.Interop.JniPeerMembers:.ctor (string,System.Type)\n\tvoid Java.Interop.JniPeerMembers:AssertSelf (Java.Interop.IJavaPeerable)\n\tvoid Java.Interop.JniPeerMembers:GetNameAndSignature (string,string&,string&)\n\tvoid Java.Interop.JniPeerMembers/JniInstanceFields:.ctor (Java.Interop.JniPeerMembers)\n\tvoid Java.Interop.JniPeerMembers/JniInstanceFields:SetValue (string,Java.Interop.IJavaPeerable,int)\n\tvoid Java.Interop.JniPeerMembers/JniInstanceMethods:.ctor (Java.Interop.JniPeerMembers)\n\tvoid Java.Interop.JniPeerMembers/JniInstanceMethods:.ctor (System.Type)\n\tvoid Java.Interop.JniPeerMembers/JniInstanceMethods:FinishCreateInstance (string,Java.Interop.IJavaPeerable,Java.Interop.JniArgumentValue*)\n\tvoid Java.Interop.JniPeerMembers/JniInstanceMethods:InvokeAbstractVoidMethod (string,Java.Interop.IJavaPeerable,Java.Interop.JniArgumentValue*)\n\tvoid Java.Interop.JniPeerMembers/JniInstanceMethods:InvokeVirtualVoidMethod (string,Java.Interop.IJavaPeerable,Java.Interop.JniArgumentValue*)\n\tvoid Java.Interop.JniPeerMembers/JniStaticFields:.ctor (Java.Interop.JniPeerMembers)\n\tvoid Java.Interop.JniPeerMembers/JniStaticMethods:.ctor (Java.Interop.JniPeerMembers)\n\tvoid Java.Interop.JniRuntime:.cctor ()\n\tvoid Java.Interop.JniRuntime:.ctor (Java.Interop.JniRuntime/CreationOptions)\n\tvoid Java.Interop.JniRuntime:AssertValid ()\n\tvoid Java.Interop.JniRuntime:set_InvocationPointer (intptr)\n\tvoid Java.Interop.JniRuntime:set_JniVersion (Java.Interop.JniVersion)\n\tvoid Java.Interop.JniRuntime:set_NewObjectRequired (bool)\n\tvoid Java.Interop.JniRuntime:set_ObjectReferenceManager (Java.Interop.JniRuntime/JniObjectReferenceManager)\n\tvoid Java.Interop.JniRuntime:set_TrackIDs (bool)\n\tvoid Java.Interop.JniRuntime:set_TypeManager (Java.Interop.JniRuntime/JniTypeManager)\n\tvoid Java.Interop.JniRuntime:SetMarshalMemberBuilder (Java.Interop.JniRuntime/CreationOptions)\n\tvoid Java.Interop.JniRuntime:SetValueManager (Java.Interop.JniRuntime/CreationOptions)\n\tvoid Java.Interop.JniRuntime:Track (Java.Interop.JniType)\n\tvoid Java.Interop.JniRuntime/CreationOptions:.ctor ()\n\tvoid Java.Interop.JniRuntime/JniObjectReferenceManager:CreatedLocalReference (Java.Interop.JniEnvironmentInfo,Java.Interop.JniObjectReference)\n\tvoid Java.Interop.JniRuntime/JniObjectReferenceManager:CreatedLocalReference (Java.Interop.JniObjectReference,int&)\n\tvoid Java.Interop.JniRuntime/JniObjectReferenceManager:DeleteGlobalReference (Java.Interop.JniObjectReference&)\n\tvoid Java.Interop.JniRuntime/JniObjectReferenceManager:DeleteLocalReference (Java.Interop.JniEnvironmentInfo,Java.Interop.JniObjectReference&)\n\tvoid Java.Interop.JniRuntime/JniObjectReferenceManager:DeleteLocalReference (Java.Interop.JniObjectReference&,int&)\n\tvoid Java.Interop.JniRuntime/JniObjectReferenceManager:OnSetRuntime (Java.Interop.JniRuntime)\n\tvoid Java.Interop.JniRuntime/JniTypeManager:.cctor ()\n\tvoid Java.Interop.JniRuntime/JniTypeManager:.ctor ()\n\tvoid Java.Interop.JniRuntime/JniTypeManager:AssertSimpleReference (string,string)\n\tvoid Java.Interop.JniRuntime/JniTypeManager:OnSetRuntime (Java.Interop.JniRuntime)\n\tvoid Java.Interop.JniRuntime/JniValueManager:.cctor ()\n\tvoid Java.Interop.JniRuntime/JniValueManager:.ctor ()\n\tvoid Java.Interop.JniRuntime/JniValueManager:DisposePeer (Java.Interop.IJavaPeerable)\n\tvoid Java.Interop.JniRuntime/JniValueManager:DisposePeer (Java.Interop.JniObjectReference,Java.Interop.IJavaPeerable)\n\tvoid Java.Interop.JniRuntime/JniValueManager:OnSetRuntime (Java.Interop.JniRuntime)\n\tvoid Java.Interop.JniTransition:.ctor (intptr)\n\tvoid Java.Interop.JniTransition:Dispose ()\n\tvoid Java.Interop.JniType:.ctor (string)\n\tvoid Java.Interop.JniType:Dispose ()\n\tvoid Java.Interop.JniType:Initialize (Java.Interop.JniObjectReference&,Java.Interop.JniObjectReferenceOptions)\n\tvoid Java.Interop.JniType:RegisterNativeMethods (Java.Interop.JniNativeMethodRegistration[])\n\tvoid Java.Interop.JniType:RegisterWithRuntime ()\n\tvoid Java.Interop.JniTypeSignature:.ctor (string,int,bool)\n\tvoid Java.Interop.ManagedPeer:.cctor ()\n\tvoid Java.Interop.ManagedPeer:Init ()\n\tvoid Java.Interop.NativeMethods:java_interop_jnienv_call_nonvirtual_void_method_a (intptr,intptr&,intptr,intptr,intptr,intptr)\n\tvoid Java.Interop.NativeMethods:java_interop_jnienv_call_void_method_a (intptr,intptr&,intptr,intptr,intptr)\n\tvoid Java.Interop.NativeMethods:java_interop_jnienv_delete_global_ref (intptr,intptr)\n\tvoid Java.Interop.NativeMethods:java_interop_jnienv_delete_local_ref (intptr,intptr)\n\tvoid Java.Interop.NativeMethods:java_interop_jnienv_exception_clear (intptr)\n\tvoid Java.Interop.NativeMethods:java_interop_jnienv_get_byte_array_region (intptr,intptr&,intptr,int,int,sbyte*)\n\tvoid Java.Interop.NativeMethods:java_interop_jnienv_release_string_chars (intptr,intptr,char*)\n\tvoid Java.Interop.NativeMethods:java_interop_jnienv_set_byte_array_region (intptr,intptr&,intptr,int,int,sbyte*)\n\tvoid Java.Interop.NativeMethods:java_interop_jnienv_set_int_field (intptr,intptr,intptr,int)\n\tvoid Java.Interop.NativeMethods:java_interop_jnienv_set_object_array_element (intptr,intptr&,intptr,int,intptr)\n\tvoid Java.Interop.Tools.TypeNameMappings.JavaNativeTypeManager:.cctor ()\n\tvoid Java.Interop.Tools.TypeNameMappings.JavaNativeTypeManager:set_PackageNamingPolicy (Java.Interop.Tools.TypeNameMappings.PackageNamingPolicy)\n\tvoid Java.Interop.Tools.TypeNameMappings.JavaNativeTypeManager/<>c:.cctor ()\n\tvoid Java.Interop.Tools.TypeNameMappings.JavaNativeTypeManager/<>c:.ctor ()\n\tvoid Java.Interop.TypeManager:.cctor ()\n\tvoid Java.Interop.TypeManager:Activate (intptr,System.Reflection.ConstructorInfo,object[])\n\tvoid Java.Interop.TypeManager:n_Activate (intptr,intptr,intptr,intptr,intptr,intptr)\n\tvoid Java.Interop.TypeManager:RegisterType (string,System.Type)\n\tvoid Java.Interop.TypeManagerMapDictionaries:.cctor ()\n\tvoid Java.IO.InputStream:.cctor ()\n\tvoid Java.IO.InputStream:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Java.IO.InputStream:Close ()\n\tvoid Java.IO.InputStream:n_Close (intptr,intptr)\n\tvoid Java.IO.InputStreamInvoker:.cctor ()\n\tvoid Java.IO.InputStreamInvoker:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Java.IO.IOException:.cctor ()\n\tvoid Java.IO.IOException:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Java.Lang.Class:.cctor ()\n\tvoid Java.Lang.Exception:.cctor ()\n\tvoid Java.Lang.Exception:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Java.Lang.IRunnableInvoker:.cctor ()\n\tvoid Java.Lang.IRunnableInvoker:n_Run (intptr,intptr)\n\tvoid Java.Lang.Object:.cctor ()\n\tvoid Java.Lang.Object:.ctor ()\n\tvoid Java.Lang.Object:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Java.Lang.Object:Dispose ()\n\tvoid Java.Lang.Object:Dispose (bool)\n\tvoid Java.Lang.Object:Java.Interop.IJavaPeerable.Disposed ()\n\tvoid Java.Lang.Object:Java.Interop.IJavaPeerable.SetJniIdentityHashCode (int)\n\tvoid Java.Lang.Object:Java.Interop.IJavaPeerable.SetPeerReference (Java.Interop.JniObjectReference)\n\tvoid Java.Lang.Object:SetHandle (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Java.Lang.String:.cctor ()\n\tvoid Java.Lang.String:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Java.Lang.String:.ctor (string)\n\tvoid Java.Lang.Thread/RunnableImplementor:.cctor ()\n\tvoid Java.Lang.Thread/RunnableImplementor:.ctor (System.Action,bool)\n\tvoid Java.Lang.Thread/RunnableImplementor:Run ()\n\tvoid Java.Lang.Throwable:.cctor ()\n\tvoid Java.Lang.Throwable:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Java.Lang.Throwable:Java.Interop.IJavaPeerable.SetJniIdentityHashCode (int)\n\tvoid Java.Lang.Throwable:SetHandle (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Microsoft.AspNetCore.Components.CascadingParameterState:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.ComponentBase:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.ComponentBase:<.ctor>b__6_0 (Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder)\n\tvoid Microsoft.AspNetCore.Components.ComponentBase:BuildRenderTree (Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder)\n\tvoid Microsoft.AspNetCore.Components.ComponentBase:Microsoft.AspNetCore.Components.IComponent.Attach (Microsoft.AspNetCore.Components.RenderHandle)\n\tvoid Microsoft.AspNetCore.Components.ComponentBase:OnAfterRender (bool)\n\tvoid Microsoft.AspNetCore.Components.ComponentBase:OnInitialized ()\n\tvoid Microsoft.AspNetCore.Components.ComponentBase:OnParametersSet ()\n\tvoid Microsoft.AspNetCore.Components.ComponentBase:StateHasChanged ()\n\tvoid Microsoft.AspNetCore.Components.ComponentBase/<RunInitAndSetParametersAsync>d__20:MoveNext ()\n\tvoid Microsoft.AspNetCore.Components.ComponentFactory:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.ComponentFactory:.ctor (Microsoft.AspNetCore.Components.IComponentActivator)\n\tvoid Microsoft.AspNetCore.Components.ComponentFactory:PerformPropertyInjection (System.IServiceProvider,Microsoft.AspNetCore.Components.IComponent)\n\tvoid Microsoft.AspNetCore.Components.ComponentFactory/<>c__DisplayClass7_0:<CreateInitializer>g__Initialize|1 (System.IServiceProvider,Microsoft.AspNetCore.Components.IComponent)\n\tvoid Microsoft.AspNetCore.Components.ComponentFactory/<>c:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.ComponentFactory/<>c:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.ComponentFactory/<>c:<CreateInitializer>b__7_0 (System.IServiceProvider,Microsoft.AspNetCore.Components.IComponent)\n\tvoid Microsoft.AspNetCore.Components.DefaultComponentActivator:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.DefaultComponentActivator:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.Dispatcher:AssertAccess ()\n\tvoid Microsoft.AspNetCore.Components.ElementReferenceJsonConverter:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.ElementReferenceJsonConverter:.ctor (Microsoft.AspNetCore.Components.ElementReferenceContext)\n\tvoid Microsoft.AspNetCore.Components.EventCallback:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.EventCallback:.ctor (Microsoft.AspNetCore.Components.IHandleEvent,System.MulticastDelegate)\n\tvoid Microsoft.AspNetCore.Components.EventCallback/<>c:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.EventCallback/<>c:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.EventCallback`1/<>c<Microsoft.AspNetCore.Components.Routing.NavigationContext>:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.EventCallback`1/<>c<Microsoft.AspNetCore.Components.Routing.NavigationContext>:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.EventCallback`1<Microsoft.AspNetCore.Components.Routing.NavigationContext>:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.EventCallback`1<Microsoft.AspNetCore.Components.Routing.NavigationContext>:.ctor (Microsoft.AspNetCore.Components.IHandleEvent,System.MulticastDelegate)\n\tvoid Microsoft.AspNetCore.Components.EventCallbackWorkItem:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.EventCallbackWorkItem:.ctor (System.MulticastDelegate)\n\tvoid Microsoft.AspNetCore.Components.HotReload.HotReloadManager:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.HotReload.HotReloadManager:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.JsonSerializerOptionsProvider:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.LayoutComponentBase:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.LayoutComponentBase:set_Body (Microsoft.AspNetCore.Components.RenderFragment)\n\tvoid Microsoft.AspNetCore.Components.LayoutView:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.LayoutView:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.LayoutView:Attach (Microsoft.AspNetCore.Components.RenderHandle)\n\tvoid Microsoft.AspNetCore.Components.LayoutView:Render ()\n\tvoid Microsoft.AspNetCore.Components.LayoutView:set_ChildContent (Microsoft.AspNetCore.Components.RenderFragment)\n\tvoid Microsoft.AspNetCore.Components.LayoutView:set_Layout (System.Type)\n\tvoid Microsoft.AspNetCore.Components.LayoutView/<>c__DisplayClass13_0:<WrapInLayout>g__Render|0 (Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder)\n\tvoid Microsoft.AspNetCore.Components.LayoutView/<>c:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.LayoutView/<>c:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.NavigationManager:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.NavigationManager:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.NavigationManager:add_LocationChanged (System.EventHandler`1<Microsoft.AspNetCore.Components.Routing.LocationChangedEventArgs>)\n\tvoid Microsoft.AspNetCore.Components.NavigationManager:AssertInitialized ()\n\tvoid Microsoft.AspNetCore.Components.NavigationManager:Initialize (string,string)\n\tvoid Microsoft.AspNetCore.Components.NavigationManager:set_BaseUri (string)\n\tvoid Microsoft.AspNetCore.Components.NavigationManager:set_Uri (string)\n\tvoid Microsoft.AspNetCore.Components.NavigationManager:Validate (System.Uri,string)\n\tvoid Microsoft.AspNetCore.Components.ParameterAttribute:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.ParameterAttribute:set_CaptureUnmatchedValues (bool)\n\tvoid Microsoft.AspNetCore.Components.ParameterValue:.ctor (string,object,bool)\n\tvoid Microsoft.AspNetCore.Components.ParameterView:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.ParameterView:.ctor (Microsoft.AspNetCore.Components.Rendering.ParameterViewLifetime&,Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame[],int,System.Collections.Generic.IReadOnlyList`1<Microsoft.AspNetCore.Components.CascadingParameterState>)\n\tvoid Microsoft.AspNetCore.Components.ParameterView:.ctor (Microsoft.AspNetCore.Components.Rendering.ParameterViewLifetime&,Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame[],int)\n\tvoid Microsoft.AspNetCore.Components.ParameterView:SetParameterProperties (object)\n\tvoid Microsoft.AspNetCore.Components.ParameterView/CascadingParameterEnumerator:.ctor (System.Collections.Generic.IReadOnlyList`1<Microsoft.AspNetCore.Components.CascadingParameterState>)\n\tvoid Microsoft.AspNetCore.Components.ParameterView/Enumerator:.ctor (Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame[],int,System.Collections.Generic.IReadOnlyList`1<Microsoft.AspNetCore.Components.CascadingParameterState>)\n\tvoid Microsoft.AspNetCore.Components.ParameterView/RenderTreeFrameParameterEnumerator:.ctor (Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame[],int)\n\tvoid Microsoft.AspNetCore.Components.Reflection.ComponentProperties:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.Reflection.ComponentProperties:<SetProperties>g__SetProperty|3_0 (object,Microsoft.AspNetCore.Components.Reflection.PropertySetter,string,object)\n\tvoid Microsoft.AspNetCore.Components.Reflection.ComponentProperties:SetProperties (Microsoft.AspNetCore.Components.ParameterView&,object)\n\tvoid Microsoft.AspNetCore.Components.Reflection.ComponentProperties/WritersForType:.ctor (System.Type)\n\tvoid Microsoft.AspNetCore.Components.Reflection.MemberAssignment/<GetPropertiesIncludingInherited>d__0:.ctor (int)\n\tvoid Microsoft.AspNetCore.Components.Reflection.MemberAssignment/<GetPropertiesIncludingInherited>d__0:<>m__Finally1 ()\n\tvoid Microsoft.AspNetCore.Components.Reflection.MemberAssignment/<GetPropertiesIncludingInherited>d__0:System.IDisposable.Dispose ()\n\tvoid Microsoft.AspNetCore.Components.Reflection.PropertySetter:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.Reflection.PropertySetter:.ctor (System.Type,System.Reflection.PropertyInfo)\n\tvoid Microsoft.AspNetCore.Components.Reflection.PropertySetter:CallPropertySetter (System.Action`2<Microsoft.AspNetCore.Components.Routing.NavLink, Microsoft.AspNetCore.Components.Routing.NavLinkMatch>,object,object)\n\tvoid Microsoft.AspNetCore.Components.Reflection.PropertySetter:CallPropertySetter (System.Action`2<Microsoft.AspNetCore.Components.Routing.Router, Microsoft.AspNetCore.Components.NavigationManager>,object,object)\n\tvoid Microsoft.AspNetCore.Components.Reflection.PropertySetter:SetValue (object,object)\n\tvoid Microsoft.AspNetCore.Components.RenderHandle:.ctor (Microsoft.AspNetCore.Components.RenderTree.Renderer,int)\n\tvoid Microsoft.AspNetCore.Components.RenderHandle:Render (Microsoft.AspNetCore.Components.RenderFragment)\n\tvoid Microsoft.AspNetCore.Components.Rendering.ComponentState:.ctor (Microsoft.AspNetCore.Components.RenderTree.Renderer,int,Microsoft.AspNetCore.Components.IComponent,Microsoft.AspNetCore.Components.Rendering.ComponentState)\n\tvoid Microsoft.AspNetCore.Components.Rendering.ComponentState:RenderIntoBatch (Microsoft.AspNetCore.Components.Rendering.RenderBatchBuilder,Microsoft.AspNetCore.Components.RenderFragment,System.Exception&)\n\tvoid Microsoft.AspNetCore.Components.Rendering.ComponentState:SetDirectParameters (Microsoft.AspNetCore.Components.ParameterView)\n\tvoid Microsoft.AspNetCore.Components.Rendering.ComponentState:SupplyCombinedParameters (Microsoft.AspNetCore.Components.ParameterView)\n\tvoid Microsoft.AspNetCore.Components.Rendering.ParameterViewLifetime:.ctor (Microsoft.AspNetCore.Components.Rendering.RenderBatchBuilder)\n\tvoid Microsoft.AspNetCore.Components.Rendering.ParameterViewLifetime:AssertNotExpired ()\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderBatchBuilder:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderBatchBuilder:ClearStateForCurrentBatch ()\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderBatchBuilder:InvalidateParameterViews ()\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderBatchBuilder/<>c:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderBatchBuilder/<>c:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderQueueEntry:.ctor (Microsoft.AspNetCore.Components.Rendering.ComponentState,Microsoft.AspNetCore.Components.RenderFragment)\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder:AddAttribute (int,string,Microsoft.AspNetCore.Components.EventCallback`1<Microsoft.AspNetCore.Components.Web.MouseEventArgs>)\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder:AddAttribute (int,string,object)\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder:AddAttribute (int,string,string)\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder:AddAttribute (int,string,System.MulticastDelegate)\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder:AddAttribute (int,string)\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder:AddContent (int,Microsoft.AspNetCore.Components.RenderFragment)\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder:AddMarkupContent (int,string)\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder:AddMultipleAttributes (int,System.Collections.Generic.IEnumerable`1<System.Collections.Generic.KeyValuePair`2<string, object>>)\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder:AssertCanAddAttribute ()\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder:AssertTreeIsValid (Microsoft.AspNetCore.Components.IComponent)\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder:Clear ()\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder:CloseComponent ()\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder:CloseElement ()\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder:CloseRegion ()\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder:OpenComponent (int,System.Type)\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder:OpenComponent (int)\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder:OpenComponentUnchecked (int,System.Type)\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder:OpenElement (int,string)\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder:OpenRegion (int)\n\tvoid Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder:ProcessDuplicateAttributes (int)\n\tvoid Microsoft.AspNetCore.Components.Rendering.SimplifiedStringHashComparer:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.Rendering.SimplifiedStringHashComparer:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff>:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff>:.ctor (int,System.Buffers.ArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff>)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff>:Clear ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff>:GrowBuffer (int)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff>:ReturnBuffer ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit>:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit>:.ctor (int,System.Buffers.ArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit>)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit>:Clear ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit>:GrowBuffer (int)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit>:ReturnBuffer ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>:.ctor (int,System.Buffers.ArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>:Clear ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>:GrowBuffer (int)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>:RemoveLast ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>:ReturnBuffer ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<System.Int32>:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<System.Int32>:.ctor (int,System.Buffers.ArrayPool`1<int>)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<System.Int32>:Clear ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<System.Int32>:ReturnBuffer ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<System.UInt64>:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<System.UInt64>:.ctor (int,System.Buffers.ArrayPool`1<ulong>)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<System.UInt64>:Clear ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<System.UInt64>:ReturnBuffer ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.ArrayBuilderSegment`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit>:.ctor (Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit>,int,int)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.RenderBatch:.ctor (Microsoft.AspNetCore.Components.RenderTree.ArrayRange`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff>,Microsoft.AspNetCore.Components.RenderTree.ArrayRange`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>,Microsoft.AspNetCore.Components.RenderTree.ArrayRange`1<int>,Microsoft.AspNetCore.Components.RenderTree.ArrayRange`1<ulong>)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.Renderer:.ctor (System.IServiceProvider,Microsoft.Extensions.Logging.ILoggerFactory,Microsoft.AspNetCore.Components.IComponentActivator)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.Renderer:.ctor (System.IServiceProvider,Microsoft.Extensions.Logging.ILoggerFactory)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.Renderer:AddToPendingTasks (System.Threading.Tasks.Task,Microsoft.AspNetCore.Components.Rendering.ComponentState)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.Renderer:AddToRenderQueue (int,Microsoft.AspNetCore.Components.RenderFragment)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.Renderer:AssignEventHandlerId (Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame&)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.Renderer:InstantiateChildComponentOnFrame (Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame&,int)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.Renderer:NotifyRenderCompleted (Microsoft.AspNetCore.Components.Rendering.ComponentState,System.Collections.Generic.List`1<System.Threading.Tasks.Task>&)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.Renderer:ProcessDisposalQueueInExistingBatch ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.Renderer:ProcessPendingRender ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.Renderer:ProcessRenderQueue ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.Renderer:RemoveEventHandlerIds (Microsoft.AspNetCore.Components.RenderTree.ArrayRange`1<ulong>,System.Threading.Tasks.Task)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.Renderer:RenderInExistingBatch (Microsoft.AspNetCore.Components.Rendering.RenderQueueEntry)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.Renderer/<<WaitForQuiescence>g__ProcessAsynchronousWork|48_0>d:MoveNext ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.Renderer/<GetErrorHandledTask>d__71:MoveNext ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.Renderer/<InvokeRenderCompletedCallsAfterUpdateDisplayTask>d__66:MoveNext ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.Renderer/<RenderRootComponentAsync>d__44:MoveNext ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.Renderer/<WaitForQuiescence>d__48:MoveNext ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.Renderer/Log:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.Renderer/Log:InitializingComponent (Microsoft.Extensions.Logging.ILogger,Microsoft.AspNetCore.Components.Rendering.ComponentState,Microsoft.AspNetCore.Components.Rendering.ComponentState)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.Renderer/Log:RenderingComponent (Microsoft.Extensions.Logging.ILogger,Microsoft.AspNetCore.Components.Rendering.ComponentState)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder:AppendDiffEntriesForFramesWithSameSequence (Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder/DiffContext&,int,int)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder:AppendDiffEntriesForRange (Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder/DiffContext&,int,int,int,int)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder:InitializeNewAttributeFrame (Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder/DiffContext&,Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame&)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder:InitializeNewComponentFrame (Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder/DiffContext&,int)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder:InitializeNewSubtree (Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder/DiffContext&,int)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder:InsertNewFrame (Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder/DiffContext&,int)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder/DiffContext:.ctor (Microsoft.AspNetCore.Components.RenderTree.Renderer,Microsoft.AspNetCore.Components.Rendering.RenderBatchBuilder,int,Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame[],Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame[])\n\tvoid Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit:.ctor (Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType,int,int)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame:.ctor (int,int,string,object)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame:.ctor (int,int,System.Type,Microsoft.AspNetCore.Components.Rendering.ComponentState,object)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameArrayBuilder:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameArrayBuilder:AppendAttribute (int,string,object)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameArrayBuilder:AppendComponent (int,System.Type)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameArrayBuilder:AppendElement (int,string)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameArrayBuilder:AppendMarkup (int,string)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameArrayBuilder:AppendRegion (int)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.StackObjectPool`1<System.Collections.Generic.Dictionary`2<System.Object, Microsoft.AspNetCore.Components.Rendering.KeyedItemInfo>>:.ctor (int,System.Func`1<System.Collections.Generic.Dictionary`2<object, Microsoft.AspNetCore.Components.Rendering.KeyedItemInfo>>)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.WebRenderer:.ctor (System.IServiceProvider,Microsoft.Extensions.Logging.ILoggerFactory,System.Text.Json.JsonSerializerOptions,Microsoft.AspNetCore.Components.Web.Infrastructure.JSComponentInterop)\n\tvoid Microsoft.AspNetCore.Components.RenderTree.WebRenderer/WebRendererInteropMethods:.ctor (Microsoft.AspNetCore.Components.RenderTree.WebRenderer,System.Text.Json.JsonSerializerOptions,Microsoft.AspNetCore.Components.Web.Infrastructure.JSComponentInterop)\n\tvoid Microsoft.AspNetCore.Components.RouteAttribute:.ctor (string)\n\tvoid Microsoft.AspNetCore.Components.RouteData:.ctor (System.Type,System.Collections.Generic.IReadOnlyDictionary`2<string, object>)\n\tvoid Microsoft.AspNetCore.Components.RouteTableFactory:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.RouteTableFactory:<GetRouteableComponents>g__GetRouteableComponents|4_0 (System.Collections.Generic.List`1<System.Type>,System.Reflection.Assembly)\n\tvoid Microsoft.AspNetCore.Components.RouteView:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.RouteView:Attach (Microsoft.AspNetCore.Components.RenderHandle)\n\tvoid Microsoft.AspNetCore.Components.RouteView:Render (Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder)\n\tvoid Microsoft.AspNetCore.Components.RouteView:RenderPageWithParameters (Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder)\n\tvoid Microsoft.AspNetCore.Components.RouteView:set_DefaultLayout (System.Type)\n\tvoid Microsoft.AspNetCore.Components.RouteView:set_NavigationManager (Microsoft.AspNetCore.Components.NavigationManager)\n\tvoid Microsoft.AspNetCore.Components.RouteView:set_RouteData (Microsoft.AspNetCore.Components.RouteData)\n\tvoid Microsoft.AspNetCore.Components.Routing.FocusOnNavigate:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.Routing.FocusOnNavigate:OnParametersSet ()\n\tvoid Microsoft.AspNetCore.Components.Routing.FocusOnNavigate:set_JSRuntime (Microsoft.JSInterop.IJSRuntime)\n\tvoid Microsoft.AspNetCore.Components.Routing.FocusOnNavigate:set_RouteData (Microsoft.AspNetCore.Components.RouteData)\n\tvoid Microsoft.AspNetCore.Components.Routing.FocusOnNavigate:set_Selector (string)\n\tvoid Microsoft.AspNetCore.Components.Routing.FocusOnNavigate/<OnAfterRenderAsync>d__15:MoveNext ()\n\tvoid Microsoft.AspNetCore.Components.Routing.NavigationContext:.ctor (string,System.Threading.CancellationToken)\n\tvoid Microsoft.AspNetCore.Components.Routing.NavLink:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.Routing.NavLink:BuildRenderTree (Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder)\n\tvoid Microsoft.AspNetCore.Components.Routing.NavLink:OnInitialized ()\n\tvoid Microsoft.AspNetCore.Components.Routing.NavLink:OnParametersSet ()\n\tvoid Microsoft.AspNetCore.Components.Routing.NavLink:set_AdditionalAttributes (System.Collections.Generic.IReadOnlyDictionary`2<string, object>)\n\tvoid Microsoft.AspNetCore.Components.Routing.NavLink:set_ChildContent (Microsoft.AspNetCore.Components.RenderFragment)\n\tvoid Microsoft.AspNetCore.Components.Routing.NavLink:set_Match (Microsoft.AspNetCore.Components.Routing.NavLinkMatch)\n\tvoid Microsoft.AspNetCore.Components.Routing.NavLink:set_NavigationManager (Microsoft.AspNetCore.Components.NavigationManager)\n\tvoid Microsoft.AspNetCore.Components.Routing.NavLink:UpdateCssClass ()\n\tvoid Microsoft.AspNetCore.Components.Routing.QueryParameterNameComparer:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.Routing.QueryParameterNameComparer:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.Routing.QueryParameterValueSupplier:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.Routing.QueryParameterValueSupplier/<>c:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.Routing.QueryParameterValueSupplier/<>c:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.Routing.RouteContext:.ctor (string)\n\tvoid Microsoft.AspNetCore.Components.Routing.RouteEntry:.ctor (Microsoft.AspNetCore.Components.Routing.RouteTemplate,System.Type,System.Collections.Generic.List`1<string>)\n\tvoid Microsoft.AspNetCore.Components.Routing.RouteEntry:Match (Microsoft.AspNetCore.Components.Routing.RouteContext)\n\tvoid Microsoft.AspNetCore.Components.Routing.RouteKey:.ctor (System.Reflection.Assembly,System.Collections.Generic.IEnumerable`1<System.Reflection.Assembly>)\n\tvoid Microsoft.AspNetCore.Components.Routing.Router:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.Routing.Router:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.Routing.Router:Attach (Microsoft.AspNetCore.Components.RenderHandle)\n\tvoid Microsoft.AspNetCore.Components.Routing.Router:Refresh (bool)\n\tvoid Microsoft.AspNetCore.Components.Routing.Router:RefreshRouteTable ()\n\tvoid Microsoft.AspNetCore.Components.Routing.Router:set_AppAssembly (System.Reflection.Assembly)\n\tvoid Microsoft.AspNetCore.Components.Routing.Router:set_Found (Microsoft.AspNetCore.Components.RenderFragment`1<Microsoft.AspNetCore.Components.RouteData>)\n\tvoid Microsoft.AspNetCore.Components.Routing.Router:set_LoggerFactory (Microsoft.Extensions.Logging.ILoggerFactory)\n\tvoid Microsoft.AspNetCore.Components.Routing.Router:set_NavigationInterception (Microsoft.AspNetCore.Components.Routing.INavigationInterception)\n\tvoid Microsoft.AspNetCore.Components.Routing.Router:set_NavigationManager (Microsoft.AspNetCore.Components.NavigationManager)\n\tvoid Microsoft.AspNetCore.Components.Routing.Router:set_NotFound (Microsoft.AspNetCore.Components.RenderFragment)\n\tvoid Microsoft.AspNetCore.Components.Routing.Router/<>c:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.Routing.Router/<>c:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.Routing.Router/<RunOnNavigateAsync>d__61:MoveNext ()\n\tvoid Microsoft.AspNetCore.Components.Routing.Router/<SetParametersAsync>d__55:MoveNext ()\n\tvoid Microsoft.AspNetCore.Components.Routing.Router/Log:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.Routing.Router/Log:NavigatingToComponent (Microsoft.Extensions.Logging.ILogger,System.Type,string,string)\n\tvoid Microsoft.AspNetCore.Components.Routing.RouteTable:Route (Microsoft.AspNetCore.Components.Routing.RouteContext)\n\tvoid Microsoft.AspNetCore.Components.Routing.RouteTemplate:.ctor (string,Microsoft.AspNetCore.Components.Routing.TemplateSegment[])\n\tvoid Microsoft.AspNetCore.Components.Routing.TemplateParser:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.Web.Infrastructure.JSComponentInterop:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.Web.Infrastructure.JSComponentInterop:.ctor (Microsoft.AspNetCore.Components.Web.JSComponentConfigurationStore)\n\tvoid Microsoft.AspNetCore.Components.Web.JSComponentConfigurationStore:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.WebElementReferenceContext:.ctor (Microsoft.JSInterop.IJSRuntime)\n\tvoid Microsoft.AspNetCore.Components.WebView.<>c__DisplayClass13_0/<<NotifyErrors>g__AwaitAndNotify|0>d:MoveNext ()\n\tvoid Microsoft.AspNetCore.Components.WebView.<>c__DisplayClass18_0/<<MessageReceived>b__0>d:MoveNext ()\n\tvoid Microsoft.AspNetCore.Components.WebView.ArrayBuilder`1<System.Byte>:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.WebView.ArrayBuilder`1<System.Byte>:.ctor (int,System.Buffers.ArrayPool`1<byte>)\n\tvoid Microsoft.AspNetCore.Components.WebView.ArrayBuilder`1<System.Byte>:GrowBuffer (int)\n\tvoid Microsoft.AspNetCore.Components.WebView.ArrayBuilder`1<System.Byte>:ReturnBuffer ()\n\tvoid Microsoft.AspNetCore.Components.WebView.ArrayBuilder`1<System.String>:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.WebView.ArrayBuilder`1<System.String>:.ctor (int,System.Buffers.ArrayPool`1<string>)\n\tvoid Microsoft.AspNetCore.Components.WebView.ArrayBuilder`1<System.String>:Dispose ()\n\tvoid Microsoft.AspNetCore.Components.WebView.ArrayBuilder`1<System.String>:GrowBuffer (int)\n\tvoid Microsoft.AspNetCore.Components.WebView.ArrayBuilder`1<System.String>:ReturnBuffer ()\n\tvoid Microsoft.AspNetCore.Components.WebView.ArrayBuilderMemoryStream:Dispose (bool)\n\tvoid Microsoft.AspNetCore.Components.WebView.ArrayBuilderMemoryStream:Flush ()\n\tvoid Microsoft.AspNetCore.Components.WebView.ArrayBuilderMemoryStream:Write (byte[],int,int)\n\tvoid Microsoft.AspNetCore.Components.WebView.ArrayBuilderMemoryStream:Write (System.ReadOnlySpan`1<byte>)\n\tvoid Microsoft.AspNetCore.Components.WebView.FileExtensionContentTypeProvider:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.WebView.FileExtensionContentTypeProvider:.ctor (System.Collections.Generic.IDictionary`2<string, string>)\n\tvoid Microsoft.AspNetCore.Components.WebView.IpcReceiver:EndInvokeJS (Microsoft.AspNetCore.Components.WebView.PageContext,string)\n\tvoid Microsoft.AspNetCore.Components.WebView.IpcReceiver:OnRenderCompleted (Microsoft.AspNetCore.Components.WebView.PageContext,long,string)\n\tvoid Microsoft.AspNetCore.Components.WebView.IpcReceiver/<OnMessageReceivedAsync>d__2:MoveNext ()\n\tvoid Microsoft.AspNetCore.Components.WebView.IpcSender:.ctor (Microsoft.AspNetCore.Components.Dispatcher,System.Action`1<string>)\n\tvoid Microsoft.AspNetCore.Components.WebView.IpcSender:ApplyRenderBatch (long,Microsoft.AspNetCore.Components.RenderTree.RenderBatch)\n\tvoid Microsoft.AspNetCore.Components.WebView.IpcSender:AttachToDocument (int,string)\n\tvoid Microsoft.AspNetCore.Components.WebView.IpcSender:BeginInvokeJS (long,string,string,Microsoft.JSInterop.JSCallResultType,long)\n\tvoid Microsoft.AspNetCore.Components.WebView.IpcSender:DispatchMessageWithErrorHandling (string)\n\tvoid Microsoft.AspNetCore.Components.WebView.IpcSender:NotifyErrors (System.Threading.Tasks.Task)\n\tvoid Microsoft.AspNetCore.Components.WebView.IpcSender/<>c__DisplayClass12_0:<DispatchMessageWithErrorHandling>b__0 ()\n\tvoid Microsoft.AspNetCore.Components.WebView.Maui.AndroidAssetFileProvider:.ctor (Android.Content.Res.AssetManager,string)\n\tvoid Microsoft.AspNetCore.Components.WebView.Maui.AndroidAssetFileProvider/AndroidMauiAssetFileInfo:.ctor (Android.Content.Res.AssetManager,string)\n\tvoid Microsoft.AspNetCore.Components.WebView.Maui.AndroidWebViewManager:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.WebView.Maui.AndroidWebViewManager:.ctor (Android.Webkit.WebView,System.IServiceProvider,Microsoft.AspNetCore.Components.Dispatcher,Microsoft.Extensions.FileProviders.IFileProvider,Microsoft.AspNetCore.Components.Web.JSComponentConfigurationStore,string,string)\n\tvoid Microsoft.AspNetCore.Components.WebView.Maui.AndroidWebViewManager:<SetUpMessageChannel>b__9_0 (string)\n\tvoid Microsoft.AspNetCore.Components.WebView.Maui.AndroidWebViewManager:NavigateCore (System.Uri)\n\tvoid Microsoft.AspNetCore.Components.WebView.Maui.AndroidWebViewManager:SendMessage (string)\n\tvoid Microsoft.AspNetCore.Components.WebView.Maui.AndroidWebViewManager:SetUpMessageChannel ()\n\tvoid Microsoft.AspNetCore.Components.WebView.Maui.AndroidWebViewManager/BlazorWebMessageCallback:.ctor (System.Action`1<string>)\n\tvoid Microsoft.AspNetCore.Components.WebView.Maui.AndroidWebViewManager/BlazorWebMessageCallback:OnMessage (Android.Webkit.WebMessagePort,Android.Webkit.WebMessage)\n\tvoid Microsoft.AspNetCore.Components.WebView.PageContext:.ctor (Microsoft.AspNetCore.Components.Dispatcher,Microsoft.Extensions.DependencyInjection.AsyncServiceScope,Microsoft.AspNetCore.Components.WebView.IpcSender,Microsoft.AspNetCore.Components.Web.JSComponentConfigurationStore,string,string)\n\tvoid Microsoft.AspNetCore.Components.WebView.RenderBatchWriter:.ctor (System.IO.Stream,bool)\n\tvoid Microsoft.AspNetCore.Components.WebView.RenderBatchWriter:Dispose ()\n\tvoid Microsoft.AspNetCore.Components.WebView.RenderBatchWriter:Write (Microsoft.AspNetCore.Components.RenderTree.RenderBatch&)\n\tvoid Microsoft.AspNetCore.Components.WebView.RenderBatchWriter:Write (Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff&)\n\tvoid Microsoft.AspNetCore.Components.WebView.RenderBatchWriter:Write (Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit&)\n\tvoid Microsoft.AspNetCore.Components.WebView.RenderBatchWriter:Write (Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame&)\n\tvoid Microsoft.AspNetCore.Components.WebView.RenderBatchWriter:WritePadding (System.IO.BinaryWriter,int)\n\tvoid Microsoft.AspNetCore.Components.WebView.RenderBatchWriter:WriteString (string,bool)\n\tvoid Microsoft.AspNetCore.Components.WebView.Services.WebViewJSRuntime:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.WebView.Services.WebViewJSRuntime:BeginInvokeJS (long,string,string,Microsoft.JSInterop.JSCallResultType,long)\n\tvoid Microsoft.AspNetCore.Components.WebView.Services.WebViewNavigationInterception:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.WebView.Services.WebViewNavigationManager:.ctor (Microsoft.Extensions.Logging.ILogger`1<Microsoft.AspNetCore.Components.WebView.Services.WebViewNavigationManager>)\n\tvoid Microsoft.AspNetCore.Components.WebView.Services.WebViewNavigationManager:AttachToWebView (Microsoft.AspNetCore.Components.WebView.IpcSender,string,string)\n\tvoid Microsoft.AspNetCore.Components.WebView.Services.WebViewRenderer:.ctor (System.IServiceProvider,Microsoft.AspNetCore.Components.Dispatcher,Microsoft.AspNetCore.Components.WebView.IpcSender,Microsoft.Extensions.Logging.ILoggerFactory,Microsoft.AspNetCore.Components.WebView.Services.WebViewJSRuntime,Microsoft.AspNetCore.Components.Web.Infrastructure.JSComponentInterop)\n\tvoid Microsoft.AspNetCore.Components.WebView.Services.WebViewRenderer:AttachRootComponentToBrowser (int,string)\n\tvoid Microsoft.AspNetCore.Components.WebView.Services.WebViewRenderer:NotifyRenderCompleted (long)\n\tvoid Microsoft.AspNetCore.Components.WebView.StaticContentProvider:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.WebView.StaticContentProvider:.ctor (Microsoft.Extensions.FileProviders.IFileProvider,System.Uri,string)\n\tvoid Microsoft.AspNetCore.Components.WebView.StaticWebAssetsLoader/<>c:.cctor ()\n\tvoid Microsoft.AspNetCore.Components.WebView.StaticWebAssetsLoader/<>c:.ctor ()\n\tvoid Microsoft.AspNetCore.Components.WebView.WebViewManager:.ctor (System.IServiceProvider,Microsoft.AspNetCore.Components.Dispatcher,System.Uri,Microsoft.Extensions.FileProviders.IFileProvider,Microsoft.AspNetCore.Components.Web.JSComponentConfigurationStore,string)\n\tvoid Microsoft.AspNetCore.Components.WebView.WebViewManager:MessageReceived (System.Uri,string)\n\tvoid Microsoft.AspNetCore.Components.WebView.WebViewManager:Navigate (string)\n\tvoid Microsoft.AspNetCore.Components.WebView.WebViewManager/<AttachToPageAsync>d__20:MoveNext ()\n\tvoid Microsoft.Extensions.DependencyInjection.DependencyInjectionEventSource:.cctor ()\n\tvoid Microsoft.Extensions.DependencyInjection.DependencyInjectionEventSource:.ctor ()\n\tvoid Microsoft.Extensions.DependencyInjection.DependencyInjectionEventSource:ServiceProviderBuilt (Microsoft.Extensions.DependencyInjection.ServiceProvider)\n\tvoid Microsoft.Extensions.DependencyInjection.Extensions.ServiceCollectionDescriptorExtensions:TryAdd (Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.DependencyInjection.ServiceDescriptor)\n\tvoid Microsoft.Extensions.DependencyInjection.Extensions.ServiceCollectionDescriptorExtensions:TryAddEnumerable (Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.DependencyInjection.ServiceDescriptor)\n\tvoid Microsoft.Extensions.DependencyInjection.Extensions.ServiceCollectionDescriptorExtensions:TryAddScoped (Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Type,System.Type)\n\tvoid Microsoft.Extensions.DependencyInjection.Extensions.ServiceCollectionDescriptorExtensions:TryAddScoped (Microsoft.Extensions.DependencyInjection.IServiceCollection)\n\tvoid Microsoft.Extensions.DependencyInjection.LoggingServiceCollectionExtensions/<>c:.cctor ()\n\tvoid Microsoft.Extensions.DependencyInjection.LoggingServiceCollectionExtensions/<>c:.ctor ()\n\tvoid Microsoft.Extensions.DependencyInjection.LoggingServiceCollectionExtensions/<>c:<AddLogging>b__0_0 (Microsoft.Extensions.Logging.ILoggingBuilder)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceCollection:.ctor ()\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceCollection:CopyTo (Microsoft.Extensions.DependencyInjection.ServiceDescriptor[],int)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceCollection:System.Collections.Generic.ICollection<Microsoft.Extensions.DependencyInjection.ServiceDescriptor>.Add (Microsoft.Extensions.DependencyInjection.ServiceDescriptor)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceDescriptor:.ctor (System.Type,Microsoft.Extensions.DependencyInjection.ServiceLifetime)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceDescriptor:.ctor (System.Type,object)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceDescriptor:.ctor (System.Type,System.Type,Microsoft.Extensions.DependencyInjection.ServiceLifetime)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain:.ctor ()\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain:Add (System.Type,System.Type)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain:CheckCircularDependency (System.Type)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain:Remove (System.Type)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory:.ctor (System.Collections.Generic.ICollection`1<Microsoft.Extensions.DependencyInjection.ServiceDescriptor>)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory:Add (System.Type,Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory:Populate ()\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory/<>c:.cctor ()\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory/<>c:.ctor ()\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver:.cctor ()\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver:.ctor ()\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.CompiledServiceProviderEngine:.ctor (Microsoft.Extensions.DependencyInjection.ServiceProvider)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.ConstantCallSite:.ctor (System.Type,object)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.ConstructorCallSite:.ctor (Microsoft.Extensions.DependencyInjection.ServiceLookup.ResultCache,System.Type,System.Reflection.ConstructorInfo,Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite[])\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.ConstructorCallSite:.ctor (Microsoft.Extensions.DependencyInjection.ServiceLookup.ResultCache,System.Type,System.Reflection.ConstructorInfo)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine:.ctor (Microsoft.Extensions.DependencyInjection.ServiceProvider)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine/<>c__DisplayClass2_0:<RealizeService>b__1 (object)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.IEnumerableCallSite:.ctor (Microsoft.Extensions.DependencyInjection.ServiceLookup.ResultCache,System.Type,Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite[])\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder:.cctor ()\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder:.ctor (Microsoft.Extensions.DependencyInjection.ServiceProvider)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder:AddCacheKey (Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilderContext,Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder:AddConstant (Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilderContext,object)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder:BeginCaptureDisposable (Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilderContext)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder:EndCaptureDisposable (Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilderContext)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.ResultCache:.cctor ()\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.ResultCache:.ctor (Microsoft.Extensions.DependencyInjection.ServiceLifetime,System.Type,int)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.ResultCache:.ctor (Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteResultCacheLocation,Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.ResultCache:set_Key (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.ResultCache:set_Location (Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteResultCacheLocation)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey:.cctor ()\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey:.ctor (System.Type,int)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceLookupHelpers:.cctor ()\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderCallSite:.ctor ()\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope:.ctor (Microsoft.Extensions.DependencyInjection.ServiceProvider,bool)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceProvider:.cctor ()\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceProvider:.ctor (System.Collections.Generic.ICollection`1<Microsoft.Extensions.DependencyInjection.ServiceDescriptor>,Microsoft.Extensions.DependencyInjection.ServiceProviderOptions)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceProvider:OnCreate (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceProvider:OnResolve (System.Type,Microsoft.Extensions.DependencyInjection.IServiceScope)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceProvider:ReplaceServiceAccessor (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite,System.Func`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope, object>)\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceProvider/<>c:.cctor ()\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceProvider/<>c:.ctor ()\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceProviderOptions:.cctor ()\n\tvoid Microsoft.Extensions.DependencyInjection.ServiceProviderOptions:.ctor ()\n\tvoid Microsoft.Extensions.FileProviders.Embedded.Manifest.EmbeddedFilesManifest:.cctor ()\n\tvoid Microsoft.Extensions.FileProviders.Embedded.Manifest.EmbeddedFilesManifest:.ctor (Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestDirectory)\n\tvoid Microsoft.Extensions.FileProviders.Embedded.Manifest.EmbeddedFilesManifest/<>c:.cctor ()\n\tvoid Microsoft.Extensions.FileProviders.Embedded.Manifest.EmbeddedFilesManifest/<>c:.ctor ()\n\tvoid Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestDirectory:.ctor (string,Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry[])\n\tvoid Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestDirectory:ValidateChildrenAndSetParent (Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry[],Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestDirectory)\n\tvoid Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry:.cctor ()\n\tvoid Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry:.ctor (string)\n\tvoid Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry:set_Parent (Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry)\n\tvoid Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry:SetParent (Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestDirectory)\n\tvoid Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestFile:.ctor (string,string)\n\tvoid Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestFileInfo:.ctor (System.Reflection.Assembly,Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestFile,System.DateTimeOffset)\n\tvoid Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestParser:ValidateEntries (System.Collections.Generic.List`1<Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry>)\n\tvoid Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestRootDirectory:.ctor (Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry[])\n\tvoid Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestSinkDirectory:.cctor ()\n\tvoid Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestSinkDirectory:.ctor ()\n\tvoid Microsoft.Extensions.FileProviders.ManifestEmbeddedFileProvider:.ctor (System.Reflection.Assembly,Microsoft.Extensions.FileProviders.Embedded.Manifest.EmbeddedFilesManifest,System.DateTimeOffset)\n\tvoid Microsoft.Extensions.FileProviders.ManifestEmbeddedFileProvider:.ctor (System.Reflection.Assembly)\n\tvoid Microsoft.Extensions.Internal.TypeNameHelper:.cctor ()\n\tvoid Microsoft.Extensions.Internal.TypeNameHelper:ProcessType (System.Text.StringBuilder,System.Type,Microsoft.Extensions.Internal.TypeNameHelper/DisplayNameOptions&)\n\tvoid Microsoft.Extensions.Internal.TypeNameHelper/DisplayNameOptions:.ctor (bool,bool,bool,char)\n\tvoid Microsoft.Extensions.Logging.DefaultLoggerLevelConfigureOptions:.ctor (Microsoft.Extensions.Logging.LogLevel)\n\tvoid Microsoft.Extensions.Logging.DefaultLoggerLevelConfigureOptions/<>c__DisplayClass0_0:<.ctor>b__0 (Microsoft.Extensions.Logging.LoggerFilterOptions)\n\tvoid Microsoft.Extensions.Logging.Logger`1<Microsoft.AspNetCore.Components.WebView.Services.WebViewNavigationManager>:.ctor (Microsoft.Extensions.Logging.ILoggerFactory)\n\tvoid Microsoft.Extensions.Logging.LoggerFactory:.ctor (System.Collections.Generic.IEnumerable`1<Microsoft.Extensions.Logging.ILoggerProvider>,Microsoft.Extensions.Options.IOptionsMonitor`1<Microsoft.Extensions.Logging.LoggerFilterOptions>,Microsoft.Extensions.Options.IOptions`1<Microsoft.Extensions.Logging.LoggerFactoryOptions>,Microsoft.Extensions.Logging.IExternalScopeProvider)\n\tvoid Microsoft.Extensions.Logging.LoggerFactory:RefreshFilters (Microsoft.Extensions.Logging.LoggerFilterOptions)\n\tvoid Microsoft.Extensions.Logging.LoggerFactoryOptions:.ctor ()\n\tvoid Microsoft.Extensions.Logging.LoggerFilterOptions:.ctor ()\n\tvoid Microsoft.Extensions.Logging.LogValuesFormatter:.cctor ()\n\tvoid Microsoft.Extensions.Logging.LogValuesFormatter:.ctor (string)\n\tvoid Microsoft.Extensions.Logging.LogValuesFormatter:set_OriginalFormat (string)\n\tvoid Microsoft.Extensions.Options.ConfigureOptions`1<Microsoft.Extensions.Logging.LoggerFilterOptions>:Configure (Microsoft.Extensions.Logging.LoggerFilterOptions)\n\tvoid Microsoft.Extensions.Options.Options:.cctor ()\n\tvoid Microsoft.Extensions.Options.OptionsCache`1/<>c__3`1<Microsoft.Extensions.Logging.LoggerFilterOptions, Microsoft.Extensions.Options.IOptionsFactory`1<Microsoft.Extensions.Logging.LoggerFilterOptions>>:.cctor ()\n\tvoid Microsoft.Extensions.Options.OptionsCache`1/<>c__3`1<Microsoft.Extensions.Logging.LoggerFilterOptions, Microsoft.Extensions.Options.IOptionsFactory`1<Microsoft.Extensions.Logging.LoggerFilterOptions>>:.ctor ()\n\tvoid Microsoft.Extensions.Options.OptionsCache`1<Microsoft.Extensions.Logging.LoggerFilterOptions>:.ctor ()\n\tvoid Microsoft.Extensions.Options.OptionsFactory`1<Microsoft.Extensions.Logging.LoggerFilterOptions>:.ctor (System.Collections.Generic.IEnumerable`1<Microsoft.Extensions.Options.IConfigureOptions`1<Microsoft.Extensions.Logging.LoggerFilterOptions>>,System.Collections.Generic.IEnumerable`1<Microsoft.Extensions.Options.IPostConfigureOptions`1<Microsoft.Extensions.Logging.LoggerFilterOptions>>,System.Collections.Generic.IEnumerable`1<Microsoft.Extensions.Options.IValidateOptions`1<Microsoft.Extensions.Logging.LoggerFilterOptions>>)\n\tvoid Microsoft.Extensions.Options.OptionsMonitor`1/<>c<Microsoft.Extensions.Logging.LoggerFilterOptions>:.cctor ()\n\tvoid Microsoft.Extensions.Options.OptionsMonitor`1/<>c<Microsoft.Extensions.Logging.LoggerFilterOptions>:.ctor ()\n\tvoid Microsoft.Extensions.Options.OptionsMonitor`1/ChangeTrackerDisposable<Microsoft.Extensions.Logging.LoggerFilterOptions>:.ctor (Microsoft.Extensions.Options.OptionsMonitor`1<Microsoft.Extensions.Logging.LoggerFilterOptions>,System.Action`2<Microsoft.Extensions.Logging.LoggerFilterOptions, string>)\n\tvoid Microsoft.Extensions.Options.OptionsMonitor`1<Microsoft.Extensions.Logging.LoggerFilterOptions>:.ctor (Microsoft.Extensions.Options.IOptionsFactory`1<Microsoft.Extensions.Logging.LoggerFilterOptions>,System.Collections.Generic.IEnumerable`1<Microsoft.Extensions.Options.IOptionsChangeTokenSource`1<Microsoft.Extensions.Logging.LoggerFilterOptions>>,Microsoft.Extensions.Options.IOptionsMonitorCache`1<Microsoft.Extensions.Logging.LoggerFilterOptions>)\n\tvoid Microsoft.Extensions.Options.OptionsMonitor`1<Microsoft.Extensions.Logging.LoggerFilterOptions>:add__onChange (System.Action`2<Microsoft.Extensions.Logging.LoggerFilterOptions, string>)\n\tvoid Microsoft.Extensions.Options.UnnamedOptionsManager`1<Microsoft.Extensions.Logging.LoggerFactoryOptions>:.ctor (Microsoft.Extensions.Options.IOptionsFactory`1<Microsoft.Extensions.Logging.LoggerFactoryOptions>)\n\tvoid Microsoft.Extensions.Primitives.StringSegment:.cctor ()\n\tvoid Microsoft.Extensions.Primitives.StringSegment:.ctor (string)\n\tvoid Microsoft.Extensions.Primitives.StringTokenizer:.ctor (Microsoft.Extensions.Primitives.StringSegment,char[])\n\tvoid Microsoft.Extensions.Primitives.StringTokenizer/Enumerator:.ctor (Microsoft.Extensions.Primitives.StringSegment&,char[])\n\tvoid Microsoft.JSInterop.Infrastructure.ByteArrayJsonConverter:.cctor ()\n\tvoid Microsoft.JSInterop.Infrastructure.ByteArrayJsonConverter:.ctor (Microsoft.JSInterop.JSRuntime)\n\tvoid Microsoft.JSInterop.Infrastructure.DotNetDispatcher:.cctor ()\n\tvoid Microsoft.JSInterop.Infrastructure.DotNetDispatcher:EndInvokeJS (Microsoft.JSInterop.JSRuntime,string)\n\tvoid Microsoft.JSInterop.Infrastructure.DotNetObjectReferenceJsonConverter`1<Microsoft.AspNetCore.Components.RenderTree.WebRenderer/WebRendererInteropMethods>:.ctor (Microsoft.JSInterop.JSRuntime)\n\tvoid Microsoft.JSInterop.Infrastructure.DotNetObjectReferenceJsonConverter`1<Microsoft.AspNetCore.Components.RenderTree.WebRenderer/WebRendererInteropMethods>:Write (System.Text.Json.Utf8JsonWriter,Microsoft.JSInterop.DotNetObjectReference`1<Microsoft.AspNetCore.Components.RenderTree.WebRenderer/WebRendererInteropMethods>,System.Text.Json.JsonSerializerOptions)\n\tvoid Microsoft.JSInterop.Infrastructure.DotNetStreamReferenceJsonConverter:.cctor ()\n\tvoid Microsoft.JSInterop.Infrastructure.DotNetStreamReferenceJsonConverter:.ctor (Microsoft.JSInterop.JSRuntime)\n\tvoid Microsoft.JSInterop.Infrastructure.JSObjectReferenceJsonConverter:.ctor (Microsoft.JSInterop.JSRuntime)\n\tvoid Microsoft.JSInterop.Infrastructure.JSStreamReferenceJsonConverter:.cctor ()\n\tvoid Microsoft.JSInterop.Infrastructure.JSStreamReferenceJsonConverter:.ctor (Microsoft.JSInterop.JSRuntime)\n\tvoid Microsoft.JSInterop.Infrastructure.TaskGenericsUtil:.cctor ()\n\tvoid Microsoft.JSInterop.Infrastructure.TaskGenericsUtil:SetTaskCompletionSourceResult (object,object)\n\tvoid Microsoft.JSInterop.Infrastructure.TaskGenericsUtil/<>c:.cctor ()\n\tvoid Microsoft.JSInterop.Infrastructure.TaskGenericsUtil/<>c:.ctor ()\n\tvoid Microsoft.JSInterop.Infrastructure.TaskGenericsUtil/TcsResultSetter`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>:.ctor ()\n\tvoid Microsoft.JSInterop.Infrastructure.TaskGenericsUtil/TcsResultSetter`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>:SetResult (object,object)\n\tvoid Microsoft.JSInterop.JSCallResultTypeHelper:.cctor ()\n\tvoid Microsoft.JSInterop.JSRuntime:.ctor ()\n\tvoid Microsoft.JSInterop.JSRuntime:CleanupTasksAndRegistrations (long)\n\tvoid Microsoft.JSInterop.JSRuntime/<InvokeAsync>d__16`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>:MoveNext ()\n\tvoid Microsoft.JSInterop.JSRuntimeExtensions/<InvokeVoidAsync>d__0:MoveNext ()\n\tvoid Microsoft.Win32.SafeHandles.SafeHandleZeroOrMinusOneIsInvalid:.ctor (bool)\n\tvoid Microsoft.Win32.SafeHandles.SafeWaitHandle:.ctor ()\n\tvoid modreq Microsoft.AspNetCore.Components.Reflection.PropertySetter:set_Cascading (System.Runtime.CompilerServices.IsExternalInit) Microsoft.AspNetCore.Components.Reflection.PropertySetter:set_Cascading (bool)\n\tvoid Mono.RuntimeGPtrArrayHandle:DestroyAndFree (Mono.RuntimeGPtrArrayHandle&)\n\tvoid Mono.RuntimeGPtrArrayHandle:GPtrArrayFree (Mono.RuntimeStructs/GPtrArray*)\n\tvoid Mono.SafeGPtrArrayHandle:Dispose ()\n\tvoid Mono.SafeStringMarshal:Dispose ()\n\tvoid Mono.SafeStringMarshal:GFree (intptr)\n\tvoid Spice.<>c__DisplayClass6_0/<<InvokeAsync>b__0>d:MoveNext ()\n\tvoid Spice.Application:.ctor ()\n\tvoid Spice.Application:OnMainChanged (Spice.View)\n\tvoid Spice.Application:OnMainChanging (Spice.View)\n\tvoid Spice.Application:set_Main (Spice.View)\n\tvoid Spice.BlazorWebView:.ctor ()\n\tvoid Spice.BlazorWebView:.ctor (Android.Content.Context,System.Func`2<Android.Content.Context, Android.Views.View>)\n\tvoid Spice.BlazorWebView:Initialize ()\n\tvoid Spice.BlazorWebView:LoadNativeWebView (string,string)\n\tvoid Spice.BlazorWebView:LoadWebView ()\n\tvoid Spice.BlazorWebView:OnCollectionChanged (object,System.Collections.Specialized.NotifyCollectionChangedEventArgs)\n\tvoid Spice.BlazorWebView:OnHostPageChanged (string)\n\tvoid Spice.BlazorWebView:set_HostPage (string)\n\tvoid Spice.BlazorWebView:SetClients ()\n\tvoid Spice.SpiceActivity:.ctor ()\n\tvoid Spice.SpiceActivity:OnCreate (Android.OS.Bundle)\n\tvoid Spice.SpiceBlazorWebViewClient:.cctor ()\n\tvoid Spice.SpiceBlazorWebViewClient:.ctor (Spice.BlazorWebView)\n\tvoid Spice.SpiceBlazorWebViewClient:OnPageFinished (Android.Webkit.WebView,string)\n\tvoid Spice.SpiceBlazorWebViewClient:RunBlazorStartupScripts (Android.Webkit.WebView)\n\tvoid Spice.SpiceBlazorWebViewClient/<>c__DisplayClass9_0:<RunBlazorStartupScripts>b__0 (Java.Lang.Object)\n\tvoid Spice.SpiceBlazorWebViewClient/<>c__DisplayClass9_0:<RunBlazorStartupScripts>b__1 (Java.Lang.Object)\n\tvoid Spice.SpiceBlazorWebViewClient/<>c:.cctor ()\n\tvoid Spice.SpiceBlazorWebViewClient/<>c:.ctor ()\n\tvoid Spice.SpiceBlazorWebViewClient/<>c:<RunBlazorStartupScripts>b__9_2 (Java.Lang.Object)\n\tvoid Spice.SpiceBlazorWebViewClient/JavaScriptValueCallback:.ctor (System.Action`1<Java.Lang.Object>)\n\tvoid Spice.SpiceBlazorWebViewClient/JavaScriptValueCallback:OnReceiveValue (Java.Lang.Object)\n\tvoid Spice.SpiceDispatcher:.cctor ()\n\tvoid Spice.SpiceDispatcher:.ctor ()\n\tvoid Spice.SpiceDispatcher/<>c__DisplayClass5_0:<InvokeAsync>b__0 ()\n\tvoid Spice.SpiceDispatcher/<>c__DisplayClass6_0:<InvokeAsync>b__0 ()\n\tvoid Spice.SpiceServiceProvider:.cctor ()\n\tvoid Spice.View:.ctor ()\n\tvoid Spice.View:.ctor (Android.Content.Context,System.Func`2<Android.Content.Context, Android.Views.View>)\n\tvoid Spice.View:OnHorizontalAlignChanged (Spice.Align)\n\tvoid Spice.View:OnVerticalAlignChanged (Spice.Align)\n\tvoid Spice.View:set_HorizontalAlign (Spice.Align)\n\tvoid Spice.View:set_VerticalAlign (Spice.Align)\n\tvoid Spice.WebView:.ctor (Android.Content.Context,System.Func`2<Android.Content.Context, Android.Views.View>)\n\tvoid Spice.WebView:Initialize ()\n\tvoid Spice.WebView/SpiceWebChromeClient:.ctor ()\n\tvoid System.AppContext:Setup (char**,char**,int)\n\tvoid System.ArgumentException:ThrowIfNullOrEmpty (string,string)\n\tvoid System.Array:Clear (System.Array,int,int)\n\tvoid System.Array:Clear (System.Array)\n\tvoid System.Array:Copy (System.Array,int,System.Array,int,int,bool)\n\tvoid System.Array:Copy (System.Array,int,System.Array,int,int)\n\tvoid System.Array:Copy (System.Array,System.Array,int)\n\tvoid System.Array:CopySlow (System.Array,int,System.Array,int,int,bool)\n\tvoid System.Array:CopyTo (System.Array,int)\n\tvoid System.Array:InternalCreate (System.Array&,intptr,int,int*,int*)\n\tvoid System.Array:InternalSetValue (object,intptr)\n\tvoid System.Array:Resize (int[]&,int)\n\tvoid System.Array:Resize (System.Reflection.ConstructorInfo[]&,int)\n\tvoid System.Array:SetValue (object,int)\n\tvoid System.Array:SetValueImpl (object,int)\n\tvoid System.Array:SetValueRelaxedImpl (object,int)\n\tvoid System.Array:Sort (System.Reflection.ConstructorInfo[],System.Comparison`1<System.Reflection.ConstructorInfo>)\n\tvoid System.Array/EmptyArray`1<Android.Runtime.JValue>:.cctor ()\n\tvoid System.Array/EmptyArray`1<Microsoft.AspNetCore.Components.CascadingParameterState/ReflectedCascadingParameterInfo>:.cctor ()\n\tvoid System.Array/EmptyArray`1<Microsoft.AspNetCore.Components.CascadingParameterState>:.cctor ()\n\tvoid System.Array/EmptyArray`1<Microsoft.AspNetCore.Components.Rendering.RenderQueueEntry>:.cctor ()\n\tvoid System.Array/EmptyArray`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff>:.cctor ()\n\tvoid System.Array/EmptyArray`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit>:.cctor ()\n\tvoid System.Array/EmptyArray`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>:.cctor ()\n\tvoid System.Array/EmptyArray`1<System.Byte>:.cctor ()\n\tvoid System.Array/EmptyArray`1<System.Int32>:.cctor ()\n\tvoid System.Array/EmptyArray`1<System.Reflection.ParameterModifier>:.cctor ()\n\tvoid System.Array/EmptyArray`1<System.Type>:.cctor ()\n\tvoid System.Array/EmptyArray`1<System.UInt64>:.cctor ()\n\tvoid System.ArraySegment`1<System.Text.Json.JsonElement>:.cctor ()\n\tvoid System.ArraySegment`1<System.Text.Json.JsonElement>:.ctor (System.Text.Json.JsonElement[],int,int)\n\tvoid System.ArraySegment`1<System.Text.Json.JsonElement>:.ctor (System.Text.Json.JsonElement[])\n\tvoid System.AttributeUsageAttribute:.cctor ()\n\tvoid System.AttributeUsageAttribute:.ctor (System.AttributeTargets)\n\tvoid System.AttributeUsageAttribute:set_AllowMultiple (bool)\n\tvoid System.AttributeUsageAttribute:set_Inherited (bool)\n\tvoid System.BitConverter:.cctor ()\n\tvoid System.Boolean:.cctor ()\n\tvoid System.Buffer:__ZeroMemory (void*,uintptr)\n\tvoid System.Buffer:_ZeroMemory (byte&,uintptr)\n\tvoid System.Buffer:BulkMoveWithWriteBarrier (byte&,byte&,uintptr,intptr)\n\tvoid System.Buffer:Memmove (byte&,byte&,uintptr)\n\tvoid System.Buffers.ArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff>:.cctor ()\n\tvoid System.Buffers.ArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff>:.ctor ()\n\tvoid System.Buffers.ArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit>:.cctor ()\n\tvoid System.Buffers.ArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit>:.ctor ()\n\tvoid System.Buffers.ArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>:.cctor ()\n\tvoid System.Buffers.ArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>:.ctor ()\n\tvoid System.Buffers.ArrayPool`1<System.Byte>:.cctor ()\n\tvoid System.Buffers.ArrayPool`1<System.Byte>:.ctor ()\n\tvoid System.Buffers.ArrayPool`1<System.Char>:.cctor ()\n\tvoid System.Buffers.ArrayPool`1<System.Char>:.ctor ()\n\tvoid System.Buffers.ArrayPool`1<System.Int32>:.cctor ()\n\tvoid System.Buffers.ArrayPool`1<System.Int32>:.ctor ()\n\tvoid System.Buffers.ArrayPool`1<System.UInt64>:.cctor ()\n\tvoid System.Buffers.ArrayPool`1<System.UInt64>:.ctor ()\n\tvoid System.Buffers.ArrayPoolEventSource:.cctor ()\n\tvoid System.Buffers.ArrayPoolEventSource:.ctor ()\n\tvoid System.Buffers.ReadOnlySequence`1<System.Byte>:.cctor ()\n\tvoid System.Buffers.ReadOnlySequence`1<System.Byte>:.ctor (byte[])\n\tvoid System.Buffers.StandardFormat:.ctor (char,byte)\n\tvoid System.Buffers.Text.Utf8Formatter:.cctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/<>c<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff>:.cctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/<>c<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff>:.ctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/<>c<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit>:.cctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/<>c<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit>:.ctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/<>c<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>:.cctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/<>c<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>:.ctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/<>c<System.Byte>:.cctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/<>c<System.Byte>:.ctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/<>c<System.Char>:.cctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/<>c<System.Char>:.ctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/<>c<System.String>:.cctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/<>c<System.String>:.ctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/PerCoreLockedStacks<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff>:.cctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/PerCoreLockedStacks<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit>:.cctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/PerCoreLockedStacks<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>:.cctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/PerCoreLockedStacks<System.Byte>:.cctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1/PerCoreLockedStacks<System.Char>:.cctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff>:.ctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff>:Return (Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff[],bool)\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit>:.ctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit>:Return (Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit[],bool)\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>:.ctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>:Return (Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame[],bool)\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<System.Byte>:.ctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<System.Byte>:Return (byte[],bool)\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<System.Char>:.ctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<System.Char>:Return (char[],bool)\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<System.Int32>:.ctor ()\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<System.String>:Return (string[],bool)\n\tvoid System.Buffers.TlsOverPerCoreLockedStacksArrayPool`1<System.UInt64>:.ctor ()\n\tvoid System.Collections.Concurrent.CDSCollectionETWBCLProvider:.cctor ()\n\tvoid System.Collections.Concurrent.CDSCollectionETWBCLProvider:.ctor ()\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2/Enumerator<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Cache`1/CacheEntry<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>>:.ctor (System.Collections.Concurrent.ConcurrentDictionary`2<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Serialization.Metadata.ReflectionEmitCachingMemberAccessor/Cache`1/CacheEntry<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>>>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2/Enumerator<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Cache`1/CacheEntry<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>>:Dispose ()\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2/Node<Microsoft.AspNetCore.Components.Routing.RouteKey, Microsoft.AspNetCore.Components.Routing.RouteTable>:.ctor (Microsoft.AspNetCore.Components.Routing.RouteKey,Microsoft.AspNetCore.Components.Routing.RouteTable,int,System.Collections.Concurrent.ConcurrentDictionary`2/Node<Microsoft.AspNetCore.Components.Routing.RouteKey, Microsoft.AspNetCore.Components.Routing.RouteTable>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2/Node<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder/GeneratedMethod>:.ctor (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey,Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder/GeneratedMethod,int,System.Collections.Concurrent.ConcurrentDictionary`2/Node<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder/GeneratedMethod>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2/Node<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite>:.ctor (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey,Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite,int,System.Collections.Concurrent.ConcurrentDictionary`2/Node<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2/Node<System.Int64, Microsoft.JSInterop.Infrastructure.IDotNetObjectReference>:.ctor (long,Microsoft.JSInterop.Infrastructure.IDotNetObjectReference,int,System.Collections.Concurrent.ConcurrentDictionary`2/Node<long, Microsoft.JSInterop.Infrastructure.IDotNetObjectReference>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2/Node<System.Int64, System.Object>:.ctor (long,object,int,System.Collections.Concurrent.ConcurrentDictionary`2/Node<long, object>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2/Node<System.Type, System.Text.Json.Serialization.Metadata.JsonTypeInfo>:.ctor (System.Type,System.Text.Json.Serialization.Metadata.JsonTypeInfo,int,System.Collections.Concurrent.ConcurrentDictionary`2/Node<System.Type, System.Text.Json.Serialization.Metadata.JsonTypeInfo>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2/Node<System.UInt64, System.Text.Json.JsonEncodedText>:.ctor (ulong,System.Text.Json.JsonEncodedText,int,System.Collections.Concurrent.ConcurrentDictionary`2/Node<ulong, System.Text.Json.JsonEncodedText>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2/Node<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Cache`1/CacheEntry<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>>:.ctor (System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>,System.Text.Json.Serialization.Metadata.ReflectionEmitCachingMemberAccessor/Cache`1/CacheEntry<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>>,int,System.Collections.Concurrent.ConcurrentDictionary`2/Node<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Serialization.Metadata.ReflectionEmitCachingMemberAccessor/Cache`1/CacheEntry<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>>>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2/Tables<Microsoft.AspNetCore.Components.Routing.RouteKey, Microsoft.AspNetCore.Components.Routing.RouteTable>:.ctor (System.Collections.Concurrent.ConcurrentDictionary`2/Node<Microsoft.AspNetCore.Components.Routing.RouteKey, Microsoft.AspNetCore.Components.Routing.RouteTable>[],object[],int[])\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2/Tables<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder/GeneratedMethod>:.ctor (System.Collections.Concurrent.ConcurrentDictionary`2/Node<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder/GeneratedMethod>[],object[],int[])\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2/Tables<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite>:.ctor (System.Collections.Concurrent.ConcurrentDictionary`2/Node<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite>[],object[],int[])\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2/Tables<System.Int64, Microsoft.JSInterop.Infrastructure.IDotNetObjectReference>:.ctor (System.Collections.Concurrent.ConcurrentDictionary`2/Node<long, Microsoft.JSInterop.Infrastructure.IDotNetObjectReference>[],object[],int[])\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2/Tables<System.Int64, System.Object>:.ctor (System.Collections.Concurrent.ConcurrentDictionary`2/Node<long, object>[],object[],int[])\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2/Tables<System.Int64, System.Threading.CancellationTokenRegistration>:.ctor (System.Collections.Concurrent.ConcurrentDictionary`2/Node<long, System.Threading.CancellationTokenRegistration>[],object[],int[])\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2/Tables<System.Type, Microsoft.AspNetCore.Components.Web.Infrastructure.JSComponentInterop/ParameterTypeCache>:.ctor (System.Collections.Concurrent.ConcurrentDictionary`2/Node<System.Type, Microsoft.AspNetCore.Components.Web.Infrastructure.JSComponentInterop/ParameterTypeCache>[],object[],int[])\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2/Tables<System.Type, System.Func`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope, System.Object>>:.ctor (System.Collections.Concurrent.ConcurrentDictionary`2/Node<System.Type, System.Func`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope, object>>[],object[],int[])\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2/Tables<System.UInt64, System.Text.Json.JsonEncodedText>:.ctor (System.Collections.Concurrent.ConcurrentDictionary`2/Node<ulong, System.Text.Json.JsonEncodedText>[],object[],int[])\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2/Tables<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Cache`1/CacheEntry<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>>:.ctor (System.Collections.Concurrent.ConcurrentDictionary`2/Node<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Serialization.Metadata.ReflectionEmitCachingMemberAccessor/Cache`1/CacheEntry<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>>>[],object[],int[])\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.AspNetCore.Components.Routing.RouteKey, Microsoft.AspNetCore.Components.Routing.RouteTable>:.cctor ()\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.AspNetCore.Components.Routing.RouteKey, Microsoft.AspNetCore.Components.Routing.RouteTable>:.ctor ()\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.AspNetCore.Components.Routing.RouteKey, Microsoft.AspNetCore.Components.Routing.RouteTable>:.ctor (int,int,bool,System.Collections.Generic.IEqualityComparer`1<Microsoft.AspNetCore.Components.Routing.RouteKey>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder/GeneratedMethod>:.cctor ()\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder/GeneratedMethod>:.ctor ()\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ILEmitResolverBuilder/GeneratedMethod>:.ctor (int,int,bool,System.Collections.Generic.IEqualityComparer`1<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite>:.cctor ()\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite>:.ctor ()\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite>:.ctor (int,int,bool,System.Collections.Generic.IEqualityComparer`1<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite>:AcquireLocks (int,int,int&)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite>:GrowTable (System.Collections.Concurrent.ConcurrentDictionary`2/Tables<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite>:ReleaseLocks (int,int)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite>:set_Item (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey,Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, Microsoft.JSInterop.Infrastructure.IDotNetObjectReference>:.cctor ()\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, Microsoft.JSInterop.Infrastructure.IDotNetObjectReference>:.ctor ()\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, Microsoft.JSInterop.Infrastructure.IDotNetObjectReference>:.ctor (int,int,bool,System.Collections.Generic.IEqualityComparer`1<long>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, Microsoft.JSInterop.Infrastructure.IDotNetObjectReference>:set_Item (long,Microsoft.JSInterop.Infrastructure.IDotNetObjectReference)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, System.Object>:.cctor ()\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, System.Object>:.ctor ()\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, System.Object>:.ctor (int,int,bool,System.Collections.Generic.IEqualityComparer`1<long>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, System.Object>:set_Item (long,object)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, System.Threading.CancellationTokenRegistration>:.cctor ()\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, System.Threading.CancellationTokenRegistration>:.ctor ()\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.Int64, System.Threading.CancellationTokenRegistration>:.ctor (int,int,bool,System.Collections.Generic.IEqualityComparer`1<long>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.String, Microsoft.AspNetCore.Components.Reflection.PropertySetter>:.ctor (System.Collections.Generic.IEqualityComparer`1<string>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.String, Microsoft.AspNetCore.Components.Reflection.PropertySetter>:AcquireAllLocks (int&)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.String, System.Lazy`1<Microsoft.Extensions.Logging.LoggerFilterOptions>>:.ctor (int,int,System.Collections.Generic.IEqualityComparer`1<string>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.Type, Microsoft.AspNetCore.Components.Web.Infrastructure.JSComponentInterop/ParameterTypeCache>:.cctor ()\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.Type, Microsoft.AspNetCore.Components.Web.Infrastructure.JSComponentInterop/ParameterTypeCache>:.ctor ()\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.Type, Microsoft.AspNetCore.Components.Web.Infrastructure.JSComponentInterop/ParameterTypeCache>:.ctor (int,int,bool,System.Collections.Generic.IEqualityComparer`1<System.Type>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.Type, System.Func`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope, System.Object>>:.cctor ()\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.Type, System.Func`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope, System.Object>>:.ctor ()\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.Type, System.Func`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope, System.Object>>:.ctor (int,int,bool,System.Collections.Generic.IEqualityComparer`1<System.Type>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.Type, System.Func`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope, System.Object>>:set_Item (System.Type,System.Func`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope, object>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.Type, System.Object>:AcquireLocks (int,int,int&)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.Type, System.Object>:GrowTable (System.Collections.Concurrent.ConcurrentDictionary`2/Tables<System.Type, object>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.Type, System.Object>:ReleaseLocks (int,int)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.UInt64, System.Text.Json.JsonEncodedText>:.cctor ()\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.UInt64, System.Text.Json.JsonEncodedText>:.ctor ()\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.UInt64, System.Text.Json.JsonEncodedText>:.ctor (int,int,bool,System.Collections.Generic.IEqualityComparer`1<ulong>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Cache`1/CacheEntry<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>>:.cctor ()\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Cache`1/CacheEntry<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>>:.ctor ()\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Cache`1/CacheEntry<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>>:.ctor (int,int,bool,System.Collections.Generic.IEqualityComparer`1<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Cache`1/CacheEntry<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>>:AcquireLocks (int,int,int&)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Cache`1/CacheEntry<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>>:GrowTable (System.Collections.Concurrent.ConcurrentDictionary`2/Tables<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Serialization.Metadata.ReflectionEmitCachingMemberAccessor/Cache`1/CacheEntry<System.ValueTuple`3<string, System.Type, System.Reflection.MemberInfo>>>)\n\tvoid System.Collections.Concurrent.ConcurrentDictionary`2<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>, System.Text.Json.Cache`1/CacheEntry<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>>:ReleaseLocks (int,int)\n\tvoid System.Collections.Concurrent.ConcurrentQueue`1<System.Object>:.ctor ()\n\tvoid System.Collections.Concurrent.ConcurrentQueue`1<System.Object>:Enqueue (object)\n\tvoid System.Collections.Concurrent.ConcurrentQueueSegment`1<System.Object>:.ctor (int)\n\tvoid System.Collections.Generic.ArrayBuilder`1<System.Char>:Add (char)\n\tvoid System.Collections.Generic.ArrayBuilder`1<System.Char>:EnsureCapacity (int)\n\tvoid System.Collections.Generic.ArrayBuilder`1<System.Char>:UncheckedAdd (char)\n\tvoid System.Collections.Generic.ArraySortHelper`1<System.Reflection.ConstructorInfo>:.cctor ()\n\tvoid System.Collections.Generic.ArraySortHelper`1<System.Reflection.ConstructorInfo>:.ctor ()\n\tvoid System.Collections.Generic.ArraySortHelper`1<System.Reflection.ConstructorInfo>:InsertionSort (System.Span`1<System.Reflection.ConstructorInfo>,System.Comparison`1<System.Reflection.ConstructorInfo>)\n\tvoid System.Collections.Generic.ArraySortHelper`1<System.Reflection.ConstructorInfo>:IntroSort (System.Span`1<System.Reflection.ConstructorInfo>,int,System.Comparison`1<System.Reflection.ConstructorInfo>)\n\tvoid System.Collections.Generic.ArraySortHelper`1<System.Reflection.ConstructorInfo>:IntrospectiveSort (System.Span`1<System.Reflection.ConstructorInfo>,System.Comparison`1<System.Reflection.ConstructorInfo>)\n\tvoid System.Collections.Generic.ArraySortHelper`1<System.Reflection.ConstructorInfo>:Sort (System.Span`1<System.Reflection.ConstructorInfo>,System.Comparison`1<System.Reflection.ConstructorInfo>)\n\tvoid System.Collections.Generic.ArraySortHelper`1<System.Reflection.ConstructorInfo>:SwapIfGreater (System.Span`1<System.Reflection.ConstructorInfo>,System.Comparison`1<System.Reflection.ConstructorInfo>,int,int)\n\tvoid System.Collections.Generic.Dictionary`2/Enumerator<System.String, Microsoft.Extensions.Logging.Logger>:.ctor (System.Collections.Generic.Dictionary`2<string, Microsoft.Extensions.Logging.Logger>,int)\n\tvoid System.Collections.Generic.Dictionary`2/Enumerator<System.String, System.Object>:Dispose ()\n\tvoid System.Collections.Generic.Dictionary`2/KeyCollection<System.String, System.String>:.ctor (System.Collections.Generic.Dictionary`2<string, string>)\n\tvoid System.Collections.Generic.Dictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, System.Object>:.ctor ()\n\tvoid System.Collections.Generic.Dictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, System.Object>:.ctor (int,System.Collections.Generic.IEqualityComparer`1<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey>)\n\tvoid System.Collections.Generic.Dictionary`2<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey, System.Object>:Add (Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey,object)\n\tvoid System.Collections.Generic.Dictionary`2<System.Action, Java.Lang.Thread/RunnableImplementor>:set_Item (System.Action,Java.Lang.Thread/RunnableImplementor)\n\tvoid System.Collections.Generic.Dictionary`2<System.Int32, Microsoft.AspNetCore.Components.Rendering.ComponentState>:.ctor ()\n\tvoid System.Collections.Generic.Dictionary`2<System.Int32, Microsoft.AspNetCore.Components.Rendering.ComponentState>:.ctor (int,System.Collections.Generic.IEqualityComparer`1<int>)\n\tvoid System.Collections.Generic.Dictionary`2<System.Int32, Microsoft.AspNetCore.Components.Rendering.ComponentState>:Add (int,Microsoft.AspNetCore.Components.Rendering.ComponentState)\n\tvoid System.Collections.Generic.Dictionary`2<System.Int32, Microsoft.AspNetCore.Components.Rendering.ComponentState>:Resize ()\n\tvoid System.Collections.Generic.Dictionary`2<System.Int32, Microsoft.AspNetCore.Components.Rendering.ComponentState>:Resize (int,bool)\n\tvoid System.Collections.Generic.Dictionary`2<System.Int32, System.Boolean>:.ctor ()\n\tvoid System.Collections.Generic.Dictionary`2<System.Int32, System.Boolean>:.ctor (int,System.Collections.Generic.IEqualityComparer`1<int>)\n\tvoid System.Collections.Generic.Dictionary`2<System.Int32, System.Boolean>:Add (int,bool)\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, Android.Runtime.IdentityHashTargets>:.ctor ()\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, Android.Runtime.IdentityHashTargets>:.ctor (int,System.Collections.Generic.IEqualityComparer`1<intptr>)\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, Android.Runtime.IdentityHashTargets>:Add (intptr,Android.Runtime.IdentityHashTargets)\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, Android.Runtime.IdentityHashTargets>:Resize ()\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, Android.Runtime.IdentityHashTargets>:Resize (int,bool)\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, Java.Interop.JniRuntime>:.ctor ()\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, Java.Interop.JniRuntime>:.ctor (int,System.Collections.Generic.IEqualityComparer`1<intptr>)\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, Java.Interop.JniRuntime>:set_Item (intptr,Java.Interop.JniRuntime)\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, System.IDisposable>:.ctor ()\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, System.IDisposable>:.ctor (int,System.Collections.Generic.IEqualityComparer`1<intptr>)\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, System.IDisposable>:Resize ()\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, System.IDisposable>:Resize (int,bool)\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, System.IDisposable>:set_Item (intptr,System.IDisposable)\n\tvoid System.Collections.Generic.Dictionary`2<System.String, Java.Interop.JniMethodInfo>:.ctor (System.Collections.Generic.IEqualityComparer`1<string>)\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.Int32>:.ctor ()\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.Int32>:.ctor (int,System.Collections.Generic.IEqualityComparer`1<string>)\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.Int32>:.ctor (System.Collections.Generic.IEqualityComparer`1<string>)\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.Int32>:Add (string,int)\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.Int32>:Clear ()\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.Int32>:Resize ()\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.Int32>:Resize (int,bool)\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.IntPtr>:.ctor ()\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.IntPtr>:.ctor (int,System.Collections.Generic.IEqualityComparer`1<string>)\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.IntPtr>:Add (string,intptr)\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.Object>:.ctor (int,System.Collections.Generic.IEqualityComparer`1<string>)\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.Object>:.ctor (int)\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.Object>:Add (string,object)\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.Type>:Resize ()\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.Type>:Resize (int,bool)\n\tvoid System.Collections.Generic.Dictionary`2<System.Type, Java.Interop.JniValueMarshaler>:.ctor ()\n\tvoid System.Collections.Generic.Dictionary`2<System.Type, Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain/ChainItemInfo>:.ctor ()\n\tvoid System.Collections.Generic.Dictionary`2<System.Type, Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain/ChainItemInfo>:.ctor (int,System.Collections.Generic.IEqualityComparer`1<System.Type>)\n\tvoid System.Collections.Generic.Dictionary`2<System.Type, Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain/ChainItemInfo>:Resize ()\n\tvoid System.Collections.Generic.Dictionary`2<System.Type, Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain/ChainItemInfo>:Resize (int,bool)\n\tvoid System.Collections.Generic.Dictionary`2<System.Type, Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain/ChainItemInfo>:set_Item (System.Type,Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteChain/ChainItemInfo)\n\tvoid System.Collections.Generic.Dictionary`2<System.Type, Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory/ServiceDescriptorCacheItem>:.ctor ()\n\tvoid System.Collections.Generic.Dictionary`2<System.Type, Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory/ServiceDescriptorCacheItem>:.ctor (int,System.Collections.Generic.IEqualityComparer`1<System.Type>)\n\tvoid System.Collections.Generic.Dictionary`2<System.Type, Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory/ServiceDescriptorCacheItem>:Resize ()\n\tvoid System.Collections.Generic.Dictionary`2<System.Type, Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory/ServiceDescriptorCacheItem>:Resize (int,bool)\n\tvoid System.Collections.Generic.Dictionary`2<System.Type, Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory/ServiceDescriptorCacheItem>:set_Item (System.Type,Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory/ServiceDescriptorCacheItem)\n\tvoid System.Collections.Generic.Dictionary`2<System.UInt64, Microsoft.AspNetCore.Components.EventCallback>:.ctor ()\n\tvoid System.Collections.Generic.Dictionary`2<System.UInt64, Microsoft.AspNetCore.Components.EventCallback>:.ctor (int,System.Collections.Generic.IEqualityComparer`1<ulong>)\n\tvoid System.Collections.Generic.Dictionary`2<System.UInt64, Microsoft.AspNetCore.Components.EventCallback>:Add (ulong,Microsoft.AspNetCore.Components.EventCallback)\n\tvoid System.Collections.Generic.Dictionary`2<System.UInt64, System.UInt64>:.ctor ()\n\tvoid System.Collections.Generic.Dictionary`2<System.UInt64, System.UInt64>:.ctor (int,System.Collections.Generic.IEqualityComparer`1<ulong>)\n\tvoid System.Collections.Generic.EnumEqualityComparer`1<Spice.Align>:.ctor ()\n\tvoid System.Collections.Generic.GenericEqualityComparer`1<Microsoft.AspNetCore.Components.Routing.RouteKey>:.ctor ()\n\tvoid System.Collections.Generic.GenericEqualityComparer`1<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCacheKey>:.ctor ()\n\tvoid System.Collections.Generic.GenericEqualityComparer`1<Microsoft.JSInterop.Infrastructure.DotNetDispatcher/AssemblyKey>:.ctor ()\n\tvoid System.Collections.Generic.GenericEqualityComparer`1<System.Int32>:.ctor ()\n\tvoid System.Collections.Generic.GenericEqualityComparer`1<System.Int64>:.ctor ()\n\tvoid System.Collections.Generic.GenericEqualityComparer`1<System.IntPtr>:.ctor ()\n\tvoid System.Collections.Generic.GenericEqualityComparer`1<System.String>:.ctor ()\n\tvoid System.Collections.Generic.GenericEqualityComparer`1<System.UInt64>:.ctor ()\n\tvoid System.Collections.Generic.GenericEqualityComparer`1<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>:.ctor ()\n\tvoid System.Collections.Generic.HashSet`1/Enumerator<System.String>:.ctor (System.Collections.Generic.HashSet`1<string>)\n\tvoid System.Collections.Generic.HashSet`1<System.Type>:.ctor ()\n\tvoid System.Collections.Generic.HashSet`1<System.Type>:.ctor (System.Collections.Generic.IEqualityComparer`1<System.Type>)\n\tvoid System.Collections.Generic.HashSet`1<System.Type>:Resize ()\n\tvoid System.Collections.Generic.HashSet`1<System.Type>:Resize (int,bool)\n\tvoid System.Collections.Generic.KeyValuePair`2<System.String, Microsoft.AspNetCore.Components.WebView.WebViewManager/RootComponent>:Deconstruct (string&,Microsoft.AspNetCore.Components.WebView.WebViewManager/RootComponent&)\n\tvoid System.Collections.Generic.LargeArrayBuilder`1<System.Char>:AddRange (System.Collections.Generic.IEnumerable`1<char>)\n\tvoid System.Collections.Generic.List`1/Enumerator<Spice.RootComponent>:.ctor (System.Collections.Generic.List`1<Spice.RootComponent>)\n\tvoid System.Collections.Generic.List`1/Enumerator<Spice.RootComponent>:Dispose ()\n\tvoid System.Collections.Generic.List`1/Enumerator<System.Collections.Generic.KeyValuePair`2<System.String, System.Text.Json.Serialization.Metadata.JsonPropertyInfo>>:.ctor (System.Collections.Generic.List`1<System.Collections.Generic.KeyValuePair`2<string, System.Text.Json.Serialization.Metadata.JsonPropertyInfo>>)\n\tvoid System.Collections.Generic.List`1/Enumerator<System.ValueTuple`3<System.String, System.Type, Microsoft.AspNetCore.Components.Reflection.PropertySetter>>:.ctor (System.Collections.Generic.List`1<System.ValueTuple`3<string, System.Type, Microsoft.AspNetCore.Components.Reflection.PropertySetter>>)\n\tvoid System.Collections.Generic.List`1<Java.Interop.JniNativeMethodRegistration>:.cctor ()\n\tvoid System.Collections.Generic.List`1<Java.Interop.JniNativeMethodRegistration>:.ctor ()\n\tvoid System.Collections.Generic.List`1<Microsoft.AspNetCore.Components.CascadingParameterState/ReflectedCascadingParameterInfo>:.cctor ()\n\tvoid System.Collections.Generic.List`1<Microsoft.AspNetCore.Components.CascadingParameterState>:.cctor ()\n\tvoid System.Collections.Generic.List`1<Microsoft.AspNetCore.Components.Routing.QueryParameterValueSupplier/QueryParameterMapping>:.cctor ()\n\tvoid System.Collections.Generic.List`1<Microsoft.AspNetCore.Components.Routing.RouteEntry>:Sort (int,int,System.Collections.Generic.IComparer`1<Microsoft.AspNetCore.Components.Routing.RouteEntry>)\n\tvoid System.Collections.Generic.List`1<Microsoft.AspNetCore.Components.Routing.RouteEntry>:Sort (System.Collections.Generic.IComparer`1<Microsoft.AspNetCore.Components.Routing.RouteEntry>)\n\tvoid System.Collections.Generic.List`1<Microsoft.Extensions.DependencyInjection.ServiceDescriptor>:AddWithResize (Microsoft.Extensions.DependencyInjection.ServiceDescriptor)\n\tvoid System.Collections.Generic.List`1<Microsoft.Extensions.DependencyInjection.ServiceDescriptor>:CopyTo (Microsoft.Extensions.DependencyInjection.ServiceDescriptor[],int)\n\tvoid System.Collections.Generic.List`1<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite>:Reverse ()\n\tvoid System.Collections.Generic.List`1<Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceCallSite>:Reverse (int,int)\n\tvoid System.Collections.Generic.List`1<Microsoft.Extensions.Logging.LoggerFactory/ProviderRegistration>:.cctor ()\n\tvoid System.Collections.Generic.List`1<Microsoft.Extensions.Logging.LoggerFactory/ProviderRegistration>:.ctor ()\n\tvoid System.Collections.Generic.List`1<Microsoft.Extensions.Logging.MessageLogger>:.cctor ()\n\tvoid System.Collections.Generic.List`1<Microsoft.Extensions.Logging.MessageLogger>:.ctor ()\n\tvoid System.Collections.Generic.List`1<Microsoft.Extensions.Logging.ScopeLogger>:.cctor ()\n\tvoid System.Collections.Generic.List`1<Microsoft.Extensions.Logging.ScopeLogger>:.ctor ()\n\tvoid System.Collections.Generic.List`1<Spice.RootComponent>:Grow (int)\n\tvoid System.Collections.Generic.List`1<Spice.RootComponent>:Insert (int,Spice.RootComponent)\n\tvoid System.Collections.Generic.List`1<Spice.RootComponent>:set_Capacity (int)\n\tvoid System.Collections.Generic.List`1<Spice.View>:.cctor ()\n\tvoid System.Collections.Generic.List`1<Spice.View>:.ctor ()\n\tvoid System.Collections.Generic.List`1<System.Collections.Generic.KeyValuePair`2<System.String, System.Text.Json.Serialization.Metadata.JsonPropertyInfo>>:.cctor ()\n\tvoid System.Collections.Generic.List`1<System.Collections.Generic.KeyValuePair`2<System.String, System.Text.Json.Serialization.Metadata.JsonPropertyInfo>>:.ctor (int)\n\tvoid System.Collections.Generic.List`1<System.Int32>:.cctor ()\n\tvoid System.Collections.Generic.List`1<System.Int32>:.ctor ()\n\tvoid System.Collections.Generic.List`1<System.Int32>:.ctor (int)\n\tvoid System.Collections.Generic.List`1<System.Int32>:Grow (int)\n\tvoid System.Collections.Generic.List`1<System.Int32>:RemoveAt (int)\n\tvoid System.Collections.Generic.List`1<System.Int32>:set_Capacity (int)\n\tvoid System.Collections.Generic.List`1<System.Object>:.ctor (int)\n\tvoid System.Collections.Generic.List`1<System.Reflection.MethodBase>:CopyTo (System.Reflection.MethodBase[])\n\tvoid System.Collections.Generic.List`1<System.Text.Json.JsonElement>:.cctor ()\n\tvoid System.Collections.Generic.List`1<System.Text.Json.JsonElement>:.ctor ()\n\tvoid System.Collections.Generic.List`1<System.Text.Json.JsonElement>:AddWithResize (System.Text.Json.JsonElement)\n\tvoid System.Collections.Generic.List`1<System.Text.Json.JsonElement>:Grow (int)\n\tvoid System.Collections.Generic.List`1<System.Text.Json.JsonElement>:set_Capacity (int)\n\tvoid System.Collections.Generic.List`1<System.Text.Json.Serialization.JsonConverter>:Add (System.Text.Json.Serialization.JsonConverter)\n\tvoid System.Collections.Generic.List`1<System.ValueTuple`3<System.String, System.Type, Microsoft.AspNetCore.Components.Reflection.PropertySetter>>:.cctor ()\n\tvoid System.Collections.Generic.List`1<System.ValueTuple`3<System.String, System.Type, Microsoft.AspNetCore.Components.Reflection.PropertySetter>>:.ctor ()\n\tvoid System.Collections.Generic.List`1<System.ValueTuple`3<System.String, System.Type, Microsoft.AspNetCore.Components.Reflection.PropertySetter>>:AddWithResize (System.ValueTuple`3<string, System.Type, Microsoft.AspNetCore.Components.Reflection.PropertySetter>)\n\tvoid System.Collections.Generic.List`1<System.ValueTuple`3<System.String, System.Type, Microsoft.AspNetCore.Components.Reflection.PropertySetter>>:Grow (int)\n\tvoid System.Collections.Generic.List`1<System.ValueTuple`3<System.String, System.Type, Microsoft.AspNetCore.Components.Reflection.PropertySetter>>:set_Capacity (int)\n\tvoid System.Collections.Generic.NonRandomizedStringEqualityComparer:.cctor ()\n\tvoid System.Collections.Generic.NonRandomizedStringEqualityComparer:.ctor (System.Collections.Generic.IEqualityComparer`1<string>)\n\tvoid System.Collections.Generic.NonRandomizedStringEqualityComparer/OrdinalComparer:.ctor (System.Collections.Generic.IEqualityComparer`1<string>)\n\tvoid System.Collections.Generic.NonRandomizedStringEqualityComparer/OrdinalIgnoreCaseComparer:.ctor (System.Collections.Generic.IEqualityComparer`1<string>)\n\tvoid System.Collections.Generic.Queue`1<Microsoft.AspNetCore.Components.Rendering.RenderQueueEntry>:Enqueue (Microsoft.AspNetCore.Components.Rendering.RenderQueueEntry)\n\tvoid System.Collections.Generic.Queue`1<Microsoft.AspNetCore.Components.Rendering.RenderQueueEntry>:Grow (int)\n\tvoid System.Collections.Generic.Queue`1<Microsoft.AspNetCore.Components.Rendering.RenderQueueEntry>:MoveNext (int&)\n\tvoid System.Collections.Generic.Queue`1<Microsoft.AspNetCore.Components.Rendering.RenderQueueEntry>:SetCapacity (int)\n\tvoid System.Collections.Generic.Queue`1<Microsoft.AspNetCore.Components.WebView.Services.WebViewRenderer/UnacknowledgedRenderBatch>:Enqueue (Microsoft.AspNetCore.Components.WebView.Services.WebViewRenderer/UnacknowledgedRenderBatch)\n\tvoid System.Collections.Generic.Queue`1<Microsoft.AspNetCore.Components.WebView.Services.WebViewRenderer/UnacknowledgedRenderBatch>:Grow (int)\n\tvoid System.Collections.Generic.Queue`1<Microsoft.AspNetCore.Components.WebView.Services.WebViewRenderer/UnacknowledgedRenderBatch>:MoveNext (int&)\n\tvoid System.Collections.Generic.Queue`1<Microsoft.AspNetCore.Components.WebView.Services.WebViewRenderer/UnacknowledgedRenderBatch>:SetCapacity (int)\n\tvoid System.Collections.Generic.ReferenceEqualityComparer:.cctor ()\n\tvoid System.Collections.Generic.ReferenceEqualityComparer:.ctor ()\n\tvoid System.Collections.Generic.Stack`1<System.Int32>:Clear ()\n\tvoid System.Collections.Generic.Stack`1<System.Int32>:Grow (int)\n\tvoid System.Collections.Generic.Stack`1<System.Int32>:Push (int)\n\tvoid System.Collections.Generic.Stack`1<System.Int32>:PushWithResize (int)\n\tvoid System.Collections.HashHelpers:.cctor ()\n\tvoid System.Collections.Hashtable:.ctor (int,single,System.Collections.IEqualityComparer)\n\tvoid System.Collections.Hashtable:.ctor (int,single)\n\tvoid System.Collections.Hashtable:.ctor (int)\n\tvoid System.Collections.Hashtable:.ctor (System.Collections.IEqualityComparer)\n\tvoid System.Collections.Hashtable:Add (object,object)\n\tvoid System.Collections.Hashtable:Insert (object,object,bool)\n\tvoid System.Collections.ObjectModel.Collection`1<Spice.RootComponent>:Add (Spice.RootComponent)\n\tvoid System.Collections.ObjectModel.Collection`1<Spice.RootComponent>:InsertItem (int,Spice.RootComponent)\n\tvoid System.Collections.ObjectModel.Collection`1<Spice.View>:.ctor ()\n\tvoid System.Collections.ObjectModel.EventArgsCache:.cctor ()\n\tvoid System.Collections.ObjectModel.ObservableCollection`1<Spice.RootComponent>:CheckReentrancy ()\n\tvoid System.Collections.ObjectModel.ObservableCollection`1<Spice.RootComponent>:InsertItem (int,Spice.RootComponent)\n\tvoid System.Collections.ObjectModel.ObservableCollection`1<Spice.RootComponent>:OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedAction,object,int)\n\tvoid System.Collections.ObjectModel.ObservableCollection`1<Spice.RootComponent>:OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedEventArgs)\n\tvoid System.Collections.ObjectModel.ObservableCollection`1<Spice.RootComponent>:OnCountPropertyChanged ()\n\tvoid System.Collections.ObjectModel.ObservableCollection`1<Spice.RootComponent>:OnIndexerPropertyChanged ()\n\tvoid System.Collections.ObjectModel.ObservableCollection`1<Spice.RootComponent>:OnPropertyChanged (System.ComponentModel.PropertyChangedEventArgs)\n\tvoid System.Collections.ObjectModel.ObservableCollection`1<Spice.View>:.ctor ()\n\tvoid System.Collections.ObjectModel.ObservableCollection`1<Spice.View>:add_CollectionChanged (System.Collections.Specialized.NotifyCollectionChangedEventHandler)\n\tvoid System.Collections.Specialized.NotifyCollectionChangedEventArgs:.ctor (System.Collections.Specialized.NotifyCollectionChangedAction,object,int)\n\tvoid System.Collections.Specialized.NotifyCollectionChangedEventArgs:.ctor (System.Collections.Specialized.NotifyCollectionChangedAction)\n\tvoid System.ComponentModel.PropertyChangingEventArgs:.ctor (string)\n\tvoid System.Convert:.cctor ()\n\tvoid System.Convert:ToBase64CharsLargeNoLineBreaks (System.ReadOnlySpan`1<byte>,System.Span`1<char>,int)\n\tvoid System.DateTime:.cctor ()\n\tvoid System.DateTime:.ctor (long,System.DateTimeKind)\n\tvoid System.DateTime:.ctor (long)\n\tvoid System.DateTimeOffset:.cctor ()\n\tvoid System.DateTimeOffset:.ctor (int16,System.DateTime)\n\tvoid System.DateTimeOffset:.ctor (long,System.TimeSpan)\n\tvoid System.DateTimeOffset:.ctor (System.DateTime)\n\tvoid System.DBNull:.cctor ()\n\tvoid System.DBNull:.ctor ()\n\tvoid System.DefaultBinder:.cctor ()\n\tvoid System.DefaultBinder:.ctor ()\n\tvoid System.Diagnostics.Stopwatch:.cctor ()\n\tvoid System.Diagnostics.Tracing.EventSource:.cctor ()\n\tvoid System.Diagnostics.Tracing.EventSource:.ctor ()\n\tvoid System.Diagnostics.Tracing.EventSource:.ctor (System.Diagnostics.Tracing.EventSourceSettings,string[])\n\tvoid System.Diagnostics.Tracing.EventSource:.ctor (System.Diagnostics.Tracing.EventSourceSettings)\n\tvoid System.Diagnostics.Tracing.EventSource:.ctor (System.Guid,string,System.Diagnostics.Tracing.EventSourceSettings,string[])\n\tvoid System.Diagnostics.Tracing.EventSource:.ctor (System.Guid,string)\n\tvoid System.Diagnostics.Tracing.FrameworkEventSource:.cctor ()\n\tvoid System.Diagnostics.Tracing.FrameworkEventSource:.ctor ()\n\tvoid System.Diagnostics.Tracing.NativeRuntimeEventSource:.cctor ()\n\tvoid System.Diagnostics.Tracing.NativeRuntimeEventSource:.ctor ()\n\tvoid System.Enum:InternalBoxEnum (System.Runtime.CompilerServices.QCallTypeHandle,System.Runtime.CompilerServices.ObjectHandleOnStack,long)\n\tvoid System.Enum:InternalGetUnderlyingType (System.Runtime.CompilerServices.QCallTypeHandle,System.Runtime.CompilerServices.ObjectHandleOnStack)\n\tvoid System.Enum/EnumInfo:.ctor (bool,ulong[],string[])\n\tvoid System.Environment:.cctor ()\n\tvoid System.EventArgs:.cctor ()\n\tvoid System.EventArgs:.ctor ()\n\tvoid System.Exception:.ctor (string,System.Exception)\n\tvoid System.Exception:RestoreDispatchState (System.Exception/DispatchState&)\n\tvoid System.GC:_GetGCMemoryInfo (long&,long&,long&,long&,long&,long&)\n\tvoid System.GC:_SuppressFinalize (object)\n\tvoid System.GC:.cctor ()\n\tvoid System.GC:KeepAlive (object)\n\tvoid System.GC:register_ephemeron_array (System.Runtime.Ephemeron[])\n\tvoid System.GC:SuppressFinalize (object)\n\tvoid System.Gen2GcCallback:.ctor (System.Func`2<object, bool>,object)\n\tvoid System.Gen2GcCallback:Register (System.Func`2<object, bool>,object)\n\tvoid System.Globalization.CalendarData:.cctor ()\n\tvoid System.Globalization.CalendarData:.ctor ()\n\tvoid System.Globalization.CompareInfo:.cctor ()\n\tvoid System.Globalization.CompareInfo:.ctor (System.Globalization.CultureInfo)\n\tvoid System.Globalization.CompareInfo:IcuInitSortHandle (string)\n\tvoid System.Globalization.CompareInfo:InitSort (System.Globalization.CultureInfo)\n\tvoid System.Globalization.CompareInfo/SortHandleCache:.cctor ()\n\tvoid System.Globalization.CultureData:.cctor ()\n\tvoid System.Globalization.CultureData:.ctor ()\n\tvoid System.Globalization.CultureInfo:.cctor ()\n\tvoid System.Globalization.CultureInfo:.ctor (System.Globalization.CultureData,bool)\n\tvoid System.Globalization.GlobalizationMode/Settings:.cctor ()\n\tvoid System.Globalization.TextInfo:.cctor ()\n\tvoid System.Globalization.TextInfo:.ctor (System.Globalization.CultureData,bool)\n\tvoid System.Globalization.TextInfo:.ctor (System.Globalization.CultureData)\n\tvoid System.Globalization.TextInfo:SetReadOnlyState (bool)\n\tvoid System.Guid:.ctor (byte[])\n\tvoid System.Guid:.ctor (int,int16,int16,byte,byte,byte,byte,byte,byte,byte,byte)\n\tvoid System.Guid:.ctor (System.ReadOnlySpan`1<byte>)\n\tvoid System.Guid:.ctor (uint,uint16,uint16,byte,byte,byte,byte,byte,byte,byte,byte)\n\tvoid System.HashCode:.cctor ()\n\tvoid System.HashCode:Add (bool)\n\tvoid System.HashCode:Add (int)\n\tvoid System.HashCode:Add (int)\n\tvoid System.HashCode:Add (System.Text.Json.JsonCommentHandling)\n\tvoid System.HashCode:Add (System.Text.Json.Serialization.JsonIgnoreCondition)\n\tvoid System.HashCode:Add (System.Text.Json.Serialization.JsonNumberHandling)\n\tvoid System.HashCode:Add (System.Text.Json.Serialization.JsonUnknownTypeHandling)\n\tvoid System.IO.BinaryWriter:.cctor ()\n\tvoid System.IO.BinaryWriter:.ctor ()\n\tvoid System.IO.BinaryWriter:.ctor (System.IO.Stream,System.Text.Encoding,bool)\n\tvoid System.IO.BinaryWriter:Dispose ()\n\tvoid System.IO.BinaryWriter:Dispose (bool)\n\tvoid System.IO.BinaryWriter:Flush ()\n\tvoid System.IO.BinaryWriter:Write (byte)\n\tvoid System.IO.BinaryWriter:Write (int)\n\tvoid System.IO.BinaryWriter:Write (string)\n\tvoid System.IO.BinaryWriter:Write (ulong)\n\tvoid System.IO.BinaryWriter:Write7BitEncodedInt (int)\n\tvoid System.IO.FileStatus:EnsureCachesInitialized (Microsoft.Win32.SafeHandles.SafeFileHandle,System.ReadOnlySpan`1<char>,bool)\n\tvoid System.IO.FileStatus:RefreshCaches (Microsoft.Win32.SafeHandles.SafeFileHandle,System.ReadOnlySpan`1<char>)\n\tvoid System.IO.FileStatus:ThrowOnCacheInitializationError (System.ReadOnlySpan`1<char>)\n\tvoid System.IO.Path:.cctor ()\n\tvoid System.IO.Stream:.cctor ()\n\tvoid System.IO.Stream:.ctor ()\n\tvoid System.IO.Stream:Close ()\n\tvoid System.IO.Stream:Dispose ()\n\tvoid System.IO.Stream:ValidateReadAtLeastArguments (int,int)\n\tvoid System.IO.Stream:WriteByte (byte)\n\tvoid System.IO.Stream/NullStream:.ctor ()\n\tvoid System.IO.UnmanagedMemoryStream:.ctor (byte*,long)\n\tvoid System.IO.UnmanagedMemoryStream:Dispose (bool)\n\tvoid System.IO.UnmanagedMemoryStream:EnsureReadable ()\n\tvoid System.IO.UnmanagedMemoryStream:Initialize (byte*,long,long,System.IO.FileAccess)\n\tvoid System.Lazy`1<Android.Views.ViewGroup/LayoutParams>:ExecutionAndPublication (System.LazyHelper,bool)\n\tvoid System.Lazy`1<Android.Views.ViewGroup/LayoutParams>:ViaFactory (System.Threading.LazyThreadSafetyMode)\n\tvoid System.Lazy`1<System.Boolean>:.ctor (System.Func`1<bool>,System.Threading.LazyThreadSafetyMode,bool)\n\tvoid System.Lazy`1<System.Boolean>:.ctor (System.Func`1<bool>)\n\tvoid System.Lazy`1<System.Boolean>:ExecutionAndPublication (System.LazyHelper,bool)\n\tvoid System.Lazy`1<System.Boolean>:ViaFactory (System.Threading.LazyThreadSafetyMode)\n\tvoid System.Lazy`1<System.Int64>:.ctor (System.Func`1<long>,System.Threading.LazyThreadSafetyMode,bool)\n\tvoid System.Lazy`1<System.Int64>:.ctor (System.Func`1<long>)\n\tvoid System.LazyHelper:.cctor ()\n\tvoid System.LazyHelper:.ctor (System.LazyState)\n\tvoid System.Linq.Enumerable/AppendPrepend1Iterator`1<System.Object>:.ctor (System.Collections.Generic.IEnumerable`1<object>,object,bool)\n\tvoid System.Linq.Enumerable/AppendPrependIterator`1<System.Object>:.ctor (System.Collections.Generic.IEnumerable`1<object>)\n\tvoid System.Linq.Enumerable/AppendPrependIterator`1<System.Object>:Dispose ()\n\tvoid System.Linq.Enumerable/AppendPrependIterator`1<System.Object>:GetSourceEnumerator ()\n\tvoid System.Linq.Enumerable/Iterator`1<System.Char>:.ctor ()\n\tvoid System.Linq.Enumerable/Iterator`1<System.Char>:Dispose ()\n\tvoid System.Linq.Enumerable/Iterator`1<System.Object>:.ctor ()\n\tvoid System.Linq.Enumerable/Iterator`1<System.Object>:Dispose ()\n\tvoid System.Linq.Enumerable/WhereArrayIterator`1<System.Char>:.ctor (char[],System.Func`2<char, bool>)\n\tvoid System.Marvin:.cctor ()\n\tvoid System.Math:.cctor ()\n\tvoid System.NullReferenceException:.ctor (string)\n\tvoid System.Number:.cctor ()\n\tvoid System.OrdinalCaseSensitiveComparer:.cctor ()\n\tvoid System.OrdinalCaseSensitiveComparer:.ctor ()\n\tvoid System.OrdinalIgnoreCaseComparer:.cctor ()\n\tvoid System.OrdinalIgnoreCaseComparer:.ctor ()\n\tvoid System.OutOfMemoryException:.ctor (string)\n\tvoid System.Private.CoreLib.Interop:GetRandomBytes (byte*,int)\n\tvoid System.Private.CoreLib.Interop/ErrorInfo:.ctor (int)\n\tvoid System.Private.CoreLib.Interop/Sys:.cctor ()\n\tvoid System.Private.CoreLib.Interop/Sys:GetNonCryptographicallySecureRandomBytes (byte*,int)\n\tvoid System.Private.CoreLib.Interop/Sys:LowLevelMonitor_Acquire (intptr)\n\tvoid System.Private.CoreLib.Interop/Sys:LowLevelMonitor_Release (intptr)\n\tvoid System.Private.CoreLib.Interop/Sys:LowLevelMonitor_Wait (intptr)\n\tvoid System.Private.CoreLib.Interop/Sys:SetErrNo (int)\n\tvoid System.Private.CoreLib.KeyCollection/Enumerator<System.String, System.String>:.ctor (System.Collections.Generic.Dictionary`2<string, string>)\n\tvoid System.Private.CoreLib.KeyCollection/Enumerator<System.String, System.String>:Dispose ()\n\tvoid System.Private.CoreLib.ThreadWaitInfo/WaitedListNode:.ctor (System.Threading.WaitSubsystem/ThreadWaitInfo,int)\n\tvoid System.Private.CoreLib.ThreadWaitInfo/WaitedListNode:RegisterWait (System.Threading.WaitSubsystem/WaitableObject)\n\tvoid System.Private.CoreLib.ThreadWaitInfo/WaitedListNode:UnregisterWait (System.Threading.WaitSubsystem/WaitableObject)\n\tvoid System.Private.CoreLib.WorkerThread/<>c:.cctor ()\n\tvoid System.Private.CoreLib.WorkerThread/<>c:.ctor ()\n\tvoid System.Private.CoreLib.WorkerThread/<>c:<.cctor>b__13_0 ()\n\tvoid System.Random/XoshiroImpl:.ctor ()\n\tvoid System.Reflection.Assembly:.cctor ()\n\tvoid System.Reflection.ConstructorInfo:.cctor ()\n\tvoid System.Reflection.CustomAttribute:.cctor ()\n\tvoid System.Reflection.CustomAttribute/AttributeInfo:.ctor (System.AttributeUsageAttribute,int)\n\tvoid System.Reflection.DefaultMemberAttribute:.ctor (string)\n\tvoid System.Reflection.Emit.DynamicMethod:.ctor (string,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Reflection.Module,bool)\n\tvoid System.Reflection.Emit.DynamicMethod:.ctor (string,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type,bool)\n\tvoid System.Reflection.Emit.DynamicMethod:.ctor (string,System.Reflection.MethodAttributes,System.Reflection.CallingConventions,System.Type,System.Type[],System.Type,System.Reflection.Module,bool,bool,bool)\n\tvoid System.Reflection.Emit.DynamicMethod:.ctor (string,System.Type,System.Type[],System.Reflection.Module,bool)\n\tvoid System.Reflection.Emit.DynamicMethod:create_dynamic_method (System.Reflection.Emit.DynamicMethod)\n\tvoid System.Reflection.Emit.DynamicMethod:CreateDynMethod ()\n\tvoid System.Reflection.Emit.ILExceptionInfo:add_block (int)\n\tvoid System.Reflection.Emit.ILExceptionInfo:AddFinally (int)\n\tvoid System.Reflection.Emit.ILExceptionInfo:End (int)\n\tvoid System.Reflection.Emit.ILGenerator:.ctor (System.Reflection.Module,System.Reflection.Emit.ITokenGenerator,int)\n\tvoid System.Reflection.Emit.ILGenerator:BeginFinallyBlock ()\n\tvoid System.Reflection.Emit.ILGenerator:Emit (System.Reflection.Emit.OpCode,int)\n\tvoid System.Reflection.Emit.ILGenerator:Emit (System.Reflection.Emit.OpCode,System.Reflection.ConstructorInfo)\n\tvoid System.Reflection.Emit.ILGenerator:Emit (System.Reflection.Emit.OpCode,System.Reflection.Emit.Label)\n\tvoid System.Reflection.Emit.ILGenerator:Emit (System.Reflection.Emit.OpCode,System.Reflection.Emit.LocalBuilder)\n\tvoid System.Reflection.Emit.ILGenerator:Emit (System.Reflection.Emit.OpCode,System.Reflection.FieldInfo)\n\tvoid System.Reflection.Emit.ILGenerator:Emit (System.Reflection.Emit.OpCode,System.Reflection.MethodInfo)\n\tvoid System.Reflection.Emit.ILGenerator:Emit (System.Reflection.Emit.OpCode,System.Type)\n\tvoid System.Reflection.Emit.ILGenerator:Emit (System.Reflection.Emit.OpCode)\n\tvoid System.Reflection.Emit.ILGenerator:emit_int (int)\n\tvoid System.Reflection.Emit.ILGenerator:EndExceptionBlock ()\n\tvoid System.Reflection.Emit.ILGenerator:InternalEndClause ()\n\tvoid System.Reflection.Emit.ILGenerator:label_fixup (System.Reflection.MethodBase)\n\tvoid System.Reflection.Emit.ILGenerator:ll_emit (System.Reflection.Emit.OpCode)\n\tvoid System.Reflection.Emit.ILGenerator:make_room (int)\n\tvoid System.Reflection.Emit.ILGenerator:MarkLabel (System.Reflection.Emit.Label)\n\tvoid System.Reflection.Emit.Int32Stack:.ctor (int)\n\tvoid System.Reflection.Emit.LocalBuilder:.ctor (System.Type,System.Reflection.Emit.ILGenerator)\n\tvoid System.Reflection.Emit.OpCodes:.cctor ()\n\tvoid System.Reflection.MethodBase:CheckArguments (System.Span`1<object>,intptr*,System.Span`1<System.Reflection.ParameterCopyBackAction>,System.ReadOnlySpan`1<object>,System.RuntimeType[],System.Reflection.Binder,System.Globalization.CultureInfo,System.Reflection.BindingFlags)\n\tvoid System.Reflection.MethodBase:ValidateInvokeTarget (object)\n\tvoid System.Reflection.Missing:.cctor ()\n\tvoid System.Reflection.Missing:.ctor ()\n\tvoid System.Reflection.MonoMethodInfo:get_method_info (intptr,System.Reflection.MonoMethodInfo&)\n\tvoid System.Reflection.RuntimeAssembly:GetExportedTypes (System.Runtime.CompilerServices.QCallAssembly,System.Runtime.CompilerServices.ObjectHandleOnStack)\n\tvoid System.Reflection.RuntimeAssembly:GetInfo (System.Runtime.CompilerServices.QCallAssembly,System.Runtime.CompilerServices.ObjectHandleOnStack,System.Reflection.RuntimeAssembly/AssemblyInfoKind)\n\tvoid System.Reflection.RuntimeAssembly/UnmanagedMemoryStreamForModule:.ctor (byte*,long,System.Reflection.Module)\n\tvoid System.Reflection.RuntimeModule:GetGuidInternal (intptr,byte[])\n\tvoid System.Reflection.RuntimeParameterInfo:.ctor (string,System.Type,int,int,object,System.Reflection.MemberInfo,System.Runtime.InteropServices.MarshalAsAttribute)\n\tvoid System.Reflection.RuntimeParameterInfo:.ctor (System.Reflection.Emit.ParameterBuilder,System.Type,System.Reflection.MemberInfo,int)\n\tvoid System.Reflection.RuntimePropertyInfo:CachePropertyInfo (System.Reflection.PInfo)\n\tvoid System.Reflection.RuntimePropertyInfo:get_property_info (System.Reflection.RuntimePropertyInfo,System.Reflection.MonoPropertyInfo&,System.Reflection.PInfo)\n\tvoid System.Runtime.CompilerServices.AsyncMethodBuilderCore:Start (Microsoft.AspNetCore.Components.ComponentBase/<RunInitAndSetParametersAsync>d__20&)\n\tvoid System.Runtime.CompilerServices.AsyncMethodBuilderCore:Start (Microsoft.AspNetCore.Components.RenderTree.Renderer/<<WaitForQuiescence>g__ProcessAsynchronousWork|48_0>d&)\n\tvoid System.Runtime.CompilerServices.AsyncMethodBuilderCore:Start (Microsoft.AspNetCore.Components.RenderTree.Renderer/<GetErrorHandledTask>d__71&)\n\tvoid System.Runtime.CompilerServices.AsyncMethodBuilderCore:Start (Microsoft.AspNetCore.Components.RenderTree.Renderer/<InvokeRenderCompletedCallsAfterUpdateDisplayTask>d__66&)\n\tvoid System.Runtime.CompilerServices.AsyncMethodBuilderCore:Start (Microsoft.AspNetCore.Components.RenderTree.Renderer/<RenderRootComponentAsync>d__44&)\n\tvoid System.Runtime.CompilerServices.AsyncMethodBuilderCore:Start (Microsoft.AspNetCore.Components.RenderTree.Renderer/<WaitForQuiescence>d__48&)\n\tvoid System.Runtime.CompilerServices.AsyncMethodBuilderCore:Start (Microsoft.AspNetCore.Components.Routing.FocusOnNavigate/<OnAfterRenderAsync>d__15&)\n\tvoid System.Runtime.CompilerServices.AsyncMethodBuilderCore:Start (Microsoft.AspNetCore.Components.Routing.Router/<RunOnNavigateAsync>d__61&)\n\tvoid System.Runtime.CompilerServices.AsyncMethodBuilderCore:Start (Microsoft.AspNetCore.Components.Routing.Router/<SetParametersAsync>d__55&)\n\tvoid System.Runtime.CompilerServices.AsyncMethodBuilderCore:Start (Microsoft.AspNetCore.Components.WebView.IpcReceiver/<OnMessageReceivedAsync>d__2&)\n\tvoid System.Runtime.CompilerServices.AsyncMethodBuilderCore:Start (Microsoft.AspNetCore.Components.WebView.IpcSender/<>c__DisplayClass13_0/<<NotifyErrors>g__AwaitAndNotify|0>d&)\n\tvoid System.Runtime.CompilerServices.AsyncMethodBuilderCore:Start (Microsoft.AspNetCore.Components.WebView.WebViewManager/<>c__DisplayClass18_0/<<MessageReceived>b__0>d&)\n\tvoid System.Runtime.CompilerServices.AsyncMethodBuilderCore:Start (Microsoft.AspNetCore.Components.WebView.WebViewManager/<AttachToPageAsync>d__20&)\n\tvoid System.Runtime.CompilerServices.AsyncMethodBuilderCore:Start (Microsoft.JSInterop.JSRuntime/<InvokeAsync>d__16`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>&)\n\tvoid System.Runtime.CompilerServices.AsyncMethodBuilderCore:Start (Microsoft.JSInterop.JSRuntimeExtensions/<InvokeVoidAsync>d__0&)\n\tvoid System.Runtime.CompilerServices.AsyncMethodBuilderCore:Start (Spice.SpiceDispatcher/<>c__DisplayClass6_0/<<InvokeAsync>b__0>d&)\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder:SetResult ()\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult, Microsoft.JSInterop.JSRuntime/<InvokeAsync>d__16`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>>:.cctor ()\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult, Microsoft.JSInterop.JSRuntime/<InvokeAsync>d__16`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>>:.ctor ()\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult, Microsoft.JSInterop.JSRuntime/<InvokeAsync>d__16`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>>:ExecutionContextCallback (object)\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult, Microsoft.JSInterop.JSRuntime/<InvokeAsync>d__16`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>>:MoveNext ()\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult, Microsoft.JSInterop.JSRuntime/<InvokeAsync>d__16`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>>:MoveNext (System.Threading.Thread)\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.RenderTree.Renderer/<GetErrorHandledTask>d__71>:.cctor ()\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.RenderTree.Renderer/<GetErrorHandledTask>d__71>:.ctor ()\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.RenderTree.Renderer/<GetErrorHandledTask>d__71>:ExecutionContextCallback (object)\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.RenderTree.Renderer/<GetErrorHandledTask>d__71>:MoveNext ()\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.RenderTree.Renderer/<GetErrorHandledTask>d__71>:MoveNext (System.Threading.Thread)\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.RenderTree.Renderer/<InvokeRenderCompletedCallsAfterUpdateDisplayTask>d__66>:.cctor ()\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.RenderTree.Renderer/<InvokeRenderCompletedCallsAfterUpdateDisplayTask>d__66>:.ctor ()\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.RenderTree.Renderer/<InvokeRenderCompletedCallsAfterUpdateDisplayTask>d__66>:ExecutionContextCallback (object)\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.RenderTree.Renderer/<InvokeRenderCompletedCallsAfterUpdateDisplayTask>d__66>:MoveNext ()\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.RenderTree.Renderer/<InvokeRenderCompletedCallsAfterUpdateDisplayTask>d__66>:MoveNext (System.Threading.Thread)\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.Routing.FocusOnNavigate/<OnAfterRenderAsync>d__15>:.cctor ()\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.Routing.FocusOnNavigate/<OnAfterRenderAsync>d__15>:.ctor ()\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.Routing.FocusOnNavigate/<OnAfterRenderAsync>d__15>:ExecutionContextCallback (object)\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.Routing.FocusOnNavigate/<OnAfterRenderAsync>d__15>:MoveNext ()\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.Routing.FocusOnNavigate/<OnAfterRenderAsync>d__15>:MoveNext (System.Threading.Thread)\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.WebView.<>c__DisplayClass13_0/<<NotifyErrors>g__AwaitAndNotify|0>d>:.cctor ()\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.WebView.<>c__DisplayClass13_0/<<NotifyErrors>g__AwaitAndNotify|0>d>:.ctor ()\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.WebView.<>c__DisplayClass13_0/<<NotifyErrors>g__AwaitAndNotify|0>d>:ExecutionContextCallback (object)\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.WebView.<>c__DisplayClass13_0/<<NotifyErrors>g__AwaitAndNotify|0>d>:MoveNext ()\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.AspNetCore.Components.WebView.<>c__DisplayClass13_0/<<NotifyErrors>g__AwaitAndNotify|0>d>:MoveNext (System.Threading.Thread)\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.JSInterop.JSRuntimeExtensions/<InvokeVoidAsync>d__0>:.cctor ()\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.JSInterop.JSRuntimeExtensions/<InvokeVoidAsync>d__0>:.ctor ()\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.JSInterop.JSRuntimeExtensions/<InvokeVoidAsync>d__0>:ExecutionContextCallback (object)\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.JSInterop.JSRuntimeExtensions/<InvokeVoidAsync>d__0>:MoveNext ()\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1<System.Threading.Tasks.VoidTaskResult, Microsoft.JSInterop.JSRuntimeExtensions/<InvokeVoidAsync>d__0>:MoveNext (System.Threading.Thread)\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>:AwaitUnsafeOnCompleted (System.Runtime.CompilerServices.ValueTaskAwaiter`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>&,System.Runtime.CompilerServices.IAsyncStateMachineBox)\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>:SetExistingTaskResult (System.Threading.Tasks.Task`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>,Microsoft.JSInterop.Infrastructure.IJSVoidResult)\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<System.Threading.Tasks.VoidTaskResult>:AwaitUnsafeOnCompleted (System.Runtime.CompilerServices.TaskAwaiter&,System.Runtime.CompilerServices.IAsyncStateMachineBox)\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<System.Threading.Tasks.VoidTaskResult>:AwaitUnsafeOnCompleted (System.Runtime.CompilerServices.ValueTaskAwaiter&,System.Runtime.CompilerServices.IAsyncStateMachineBox)\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<System.Threading.Tasks.VoidTaskResult>:AwaitUnsafeOnCompleted (System.Runtime.CompilerServices.ValueTaskAwaiter`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>&,System.Runtime.CompilerServices.IAsyncStateMachineBox)\n\tvoid System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<System.Threading.Tasks.VoidTaskResult>:SetExistingTaskResult (System.Threading.Tasks.Task`1<System.Threading.Tasks.VoidTaskResult>,System.Threading.Tasks.VoidTaskResult)\n\tvoid System.Runtime.CompilerServices.AsyncValueTaskMethodBuilder:.cctor ()\n\tvoid System.Runtime.CompilerServices.AsyncValueTaskMethodBuilder:SetResult ()\n\tvoid System.Runtime.CompilerServices.AsyncValueTaskMethodBuilder`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>:.cctor ()\n\tvoid System.Runtime.CompilerServices.AsyncValueTaskMethodBuilder`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>:AwaitUnsafeOnCompleted (System.Runtime.CompilerServices.ValueTaskAwaiter`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>&,Microsoft.JSInterop.JSRuntime/<InvokeAsync>d__16`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>&)\n\tvoid System.Runtime.CompilerServices.AsyncValueTaskMethodBuilder`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>:SetResult (Microsoft.JSInterop.Infrastructure.IJSVoidResult)\n\tvoid System.Runtime.CompilerServices.AsyncValueTaskMethodBuilder`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>:Start (Microsoft.JSInterop.JSRuntime/<InvokeAsync>d__16`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>&)\n\tvoid System.Runtime.CompilerServices.AsyncValueTaskMethodBuilder`1<System.Threading.Tasks.VoidTaskResult>:.cctor ()\n\tvoid System.Runtime.CompilerServices.AsyncVoidMethodBuilder:NotifySynchronizationContextOfCompletion ()\n\tvoid System.Runtime.CompilerServices.AsyncVoidMethodBuilder:SetResult ()\n\tvoid System.Runtime.CompilerServices.DefaultInterpolatedStringHandler:.ctor (int,int)\n\tvoid System.Runtime.CompilerServices.DefaultInterpolatedStringHandler:AppendFormatted (Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType)\n\tvoid System.Runtime.CompilerServices.DefaultInterpolatedStringHandler:AppendStringDirect (string)\n\tvoid System.Runtime.CompilerServices.QCallAssembly:.ctor (System.Reflection.RuntimeAssembly&)\n\tvoid System.Runtime.CompilerServices.QCallTypeHandle:.ctor (System.RuntimeType&)\n\tvoid System.Runtime.CompilerServices.RuntimeHelpers:EnsureSufficientExecutionStack ()\n\tvoid System.Runtime.CompilerServices.TaskAwaiter:GetResult ()\n\tvoid System.Runtime.CompilerServices.TaskAwaiter:UnsafeOnCompletedInternal (System.Threading.Tasks.Task,System.Runtime.CompilerServices.IAsyncStateMachineBox,bool)\n\tvoid System.Runtime.CompilerServices.TaskAwaiter:ValidateEnd (System.Threading.Tasks.Task)\n\tvoid System.Runtime.CompilerServices.TypeForwardedFromAttribute:.ctor (string)\n\tvoid System.Runtime.CompilerServices.ValueTaskAwaiter:.cctor ()\n\tvoid System.Runtime.CompilerServices.ValueTaskAwaiter:System.Runtime.CompilerServices.IStateMachineBoxAwareAwaiter.AwaitUnsafeOnCompleted (System.Runtime.CompilerServices.IAsyncStateMachineBox)\n\tvoid System.Runtime.CompilerServices.ValueTaskAwaiter/<>c:.cctor ()\n\tvoid System.Runtime.CompilerServices.ValueTaskAwaiter/<>c:.ctor ()\n\tvoid System.Runtime.CompilerServices.ValueTaskAwaiter`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>:System.Runtime.CompilerServices.IStateMachineBoxAwareAwaiter.AwaitUnsafeOnCompleted (System.Runtime.CompilerServices.IAsyncStateMachineBox)\n\tvoid System.Runtime.DependentHandle:.ctor (object,object)\n\tvoid System.Runtime.ExceptionServices.ExceptionDispatchInfo:.ctor (System.Exception)\n\tvoid System.Runtime.ExceptionServices.ExceptionDispatchInfo:Throw ()\n\tvoid System.Runtime.InteropServices.GCHandle:.ctor (object,System.Runtime.InteropServices.GCHandleType)\n\tvoid System.Runtime.InteropServices.Marshal:.cctor ()\n\tvoid System.Runtime.InteropServices.Marshal:FreeHGlobal (intptr)\n\tvoid System.Runtime.InteropServices.Marshal:PtrToStructureHelper (intptr,object,bool)\n\tvoid System.Runtime.InteropServices.Marshal:PtrToStructureInternal (intptr,object,bool)\n\tvoid System.Runtime.InteropServices.Marshal:SetLastPInvokeError (int)\n\tvoid System.Runtime.InteropServices.Marshal:SetLastSystemError (int)\n\tvoid System.Runtime.InteropServices.Marshalling.Utf8StringMarshaller/ManagedToUnmanagedIn:Free ()\n\tvoid System.Runtime.InteropServices.Marshalling.Utf8StringMarshaller/ManagedToUnmanagedIn:FromManaged (string,System.Span`1<byte>)\n\tvoid System.Runtime.InteropServices.NativeMemory:Free (void*)\n\tvoid System.Runtime.InteropServices.SafeHandle:.ctor (intptr,bool)\n\tvoid System.Runtime.InteropServices.SafeHandle:DangerousAddRef (bool&)\n\tvoid System.Runtime.InteropServices.SafeHandle:DangerousRelease ()\n\tvoid System.Runtime.InteropServices.SafeHandle:InternalRelease (bool)\n\tvoid System.RuntimeType:.cctor ()\n\tvoid System.RuntimeType:CreateInstanceCheckThis ()\n\tvoid System.RuntimeType:FilterHelper (System.Reflection.BindingFlags,string&,bool,bool&,bool&,System.RuntimeType/MemberListType&)\n\tvoid System.RuntimeType:FilterHelper (System.Reflection.BindingFlags,string&,bool&,System.RuntimeType/MemberListType&)\n\tvoid System.RuntimeType:getFullName (System.Runtime.CompilerServices.QCallTypeHandle,System.Runtime.CompilerServices.ObjectHandleOnStack,bool,bool)\n\tvoid System.RuntimeType:GetGenericArgumentsInternal (System.Runtime.CompilerServices.QCallTypeHandle,System.Runtime.CompilerServices.ObjectHandleOnStack,bool)\n\tvoid System.RuntimeType:GetInterfaces (System.Runtime.CompilerServices.QCallTypeHandle,System.Runtime.CompilerServices.ObjectHandleOnStack)\n\tvoid System.RuntimeType:GetName (System.Runtime.CompilerServices.QCallTypeHandle,System.Runtime.CompilerServices.ObjectHandleOnStack)\n\tvoid System.RuntimeType:make_array_type (System.Runtime.CompilerServices.QCallTypeHandle,int,System.Runtime.CompilerServices.ObjectHandleOnStack)\n\tvoid System.RuntimeType:make_byref_type (System.Runtime.CompilerServices.QCallTypeHandle,System.Runtime.CompilerServices.ObjectHandleOnStack)\n\tvoid System.RuntimeType:MakeGenericType (System.Type,System.Type[],System.Runtime.CompilerServices.ObjectHandleOnStack)\n\tvoid System.RuntimeType:SanityCheckGenericArguments (System.RuntimeType[],System.RuntimeType[])\n\tvoid System.RuntimeType:ThrowIfTypeNeverValidGenericArgument (System.RuntimeType)\n\tvoid System.RuntimeType/ListBuilder`1<System.Reflection.ConstructorInfo>:.ctor (int)\n\tvoid System.RuntimeType/ListBuilder`1<System.Reflection.ConstructorInfo>:Add (System.Reflection.ConstructorInfo)\n\tvoid System.RuntimeTypeHandle:GetAssembly (System.Runtime.CompilerServices.QCallTypeHandle,System.Runtime.CompilerServices.ObjectHandleOnStack)\n\tvoid System.RuntimeTypeHandle:GetBaseType (System.Runtime.CompilerServices.QCallTypeHandle,System.Runtime.CompilerServices.ObjectHandleOnStack)\n\tvoid System.RuntimeTypeHandle:GetElementType (System.Runtime.CompilerServices.QCallTypeHandle,System.Runtime.CompilerServices.ObjectHandleOnStack)\n\tvoid System.RuntimeTypeHandle:GetGenericTypeDefinition_impl (System.Runtime.CompilerServices.QCallTypeHandle,System.Runtime.CompilerServices.ObjectHandleOnStack)\n\tvoid System.RuntimeTypeHandle:GetModule (System.Runtime.CompilerServices.QCallTypeHandle,System.Runtime.CompilerServices.ObjectHandleOnStack)\n\tvoid System.RuntimeTypeHandle:internal_from_name (intptr,System.Threading.StackCrawlMark&,System.Runtime.CompilerServices.ObjectHandleOnStack,bool,bool)\n\tvoid System.SpanHelpers:ClearWithoutReferences (byte&,uintptr)\n\tvoid System.SpanHelpers:ClearWithReferences (intptr&,uintptr)\n\tvoid System.SpanHelpers:Fill (char&,uintptr,char)\n\tvoid System.StackOverflowException:.ctor (string)\n\tvoid System.String:.ctor (char,int)\n\tvoid System.String:.ctor (char[],int,int)\n\tvoid System.String:.ctor (char*,int,int)\n\tvoid System.String:.ctor (char*)\n\tvoid System.String:.ctor (sbyte*)\n\tvoid System.String:.ctor (System.ReadOnlySpan`1<char>)\n\tvoid System.String:FillStringChecked (string,int,string)\n\tvoid System.String:memcpy (byte*,byte*,int)\n\tvoid System.String:memset (byte*,int,int)\n\tvoid System.SZGenericArrayEnumerator`1<Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry>:.cctor ()\n\tvoid System.SZGenericArrayEnumerator`1<Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry>:.ctor (Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry[])\n\tvoid System.SZGenericArrayEnumerator`1<Microsoft.Extensions.FileProviders.Embedded.Manifest.ManifestEntry>:Dispose ()\n\tvoid System.Text.CodePageDataItem:.ctor (int,string,string,string,string,uint)\n\tvoid System.Text.DecoderExceptionFallback:.cctor ()\n\tvoid System.Text.DecoderExceptionFallback:.ctor ()\n\tvoid System.Text.DecoderNLS:.ctor (System.Text.Encoding)\n\tvoid System.Text.DecoderNLS:Convert (byte[],int,int,char[],int,int,bool,int&,int&,bool&)\n\tvoid System.Text.DecoderNLS:Convert (byte*,int,char*,int,bool,int&,int&,bool&)\n\tvoid System.Text.DecoderNLS:Reset ()\n\tvoid System.Text.DecoderReplacementFallback:.cctor ()\n\tvoid System.Text.DecoderReplacementFallback:.ctor ()\n\tvoid System.Text.DecoderReplacementFallback:.ctor (string)\n\tvoid System.Text.EncoderExceptionFallback:.cctor ()\n\tvoid System.Text.EncoderExceptionFallback:.ctor ()\n\tvoid System.Text.EncoderReplacementFallback:.cctor ()\n\tvoid System.Text.EncoderReplacementFallback:.ctor ()\n\tvoid System.Text.EncoderReplacementFallback:.ctor (string)\n\tvoid System.Text.Encoding:.cctor ()\n\tvoid System.Text.Encoding:.ctor (int)\n\tvoid System.Text.Encoding:GetDataItem ()\n\tvoid System.Text.Encoding:ThrowCharsOverflow (System.Text.DecoderNLS,bool)\n\tvoid System.Text.Encodings.Web.AllowedBmpCodePointsBitmap:ForbidHtmlCharacters ()\n\tvoid System.Text.Encodings.Web.AllowedBmpCodePointsBitmap:ForbidUndefinedCharacters ()\n\tvoid System.Text.Encodings.Web.AsciiByteMap:InsertAsciiChar (char,byte)\n\tvoid System.Text.Encodings.Web.DefaultJavaScriptEncoder:.cctor ()\n\tvoid System.Text.Encodings.Web.DefaultJavaScriptEncoder:.ctor (System.Text.Encodings.Web.TextEncoderSettings,bool)\n\tvoid System.Text.Encodings.Web.DefaultJavaScriptEncoder:.ctor (System.Text.Encodings.Web.TextEncoderSettings)\n\tvoid System.Text.Encodings.Web.DefaultJavaScriptEncoder/EscaperImplementation:.cctor ()\n\tvoid System.Text.Encodings.Web.DefaultJavaScriptEncoder/EscaperImplementation:.ctor (bool)\n\tvoid System.Text.Encodings.Web.OptimizedInboxTextEncoder:.ctor (System.Text.Encodings.Web.ScalarEscaperBase,System.Text.Encodings.Web.AllowedBmpCodePointsBitmap&,bool,System.ReadOnlySpan`1<char>)\n\tvoid System.Text.Encodings.Web.OptimizedInboxTextEncoder/AllowedAsciiCodePoints:PopulateAllowedCodePoints (System.Text.Encodings.Web.AllowedBmpCodePointsBitmap&)\n\tvoid System.Text.Encodings.Web.OptimizedInboxTextEncoder/AsciiPreescapedData:PopulatePreescapedData (System.Text.Encodings.Web.AllowedBmpCodePointsBitmap&,System.Text.Encodings.Web.ScalarEscaperBase)\n\tvoid System.Text.Encodings.Web.TextEncoderSettings:.ctor (System.Text.Unicode.UnicodeRange[])\n\tvoid System.Text.Encodings.Web.TextEncoderSettings:AllowRange (System.Text.Unicode.UnicodeRange)\n\tvoid System.Text.Encodings.Web.TextEncoderSettings:AllowRanges (System.Text.Unicode.UnicodeRange[])\n\tvoid System.Text.EncodingTable:.cctor ()\n\tvoid System.Text.Json.BitStack:ResetFirstBit ()\n\tvoid System.Text.Json.Cache`1/<>c__6`1<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>, System.Func`1<System.Object>>:.cctor ()\n\tvoid System.Text.Json.Cache`1/<>c__6`1<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>, System.Func`1<System.Object>>:.ctor ()\n\tvoid System.Text.Json.JsonCamelCaseNamingPolicy:.ctor ()\n\tvoid System.Text.Json.JsonDocument:.ctor (System.ReadOnlyMemory`1<byte>,System.Text.Json.JsonDocument/MetadataDb,byte[],System.Text.Json.PooledByteBufferWriter,bool)\n\tvoid System.Text.Json.JsonDocument:CheckExpectedType (System.Text.Json.JsonTokenType,System.Text.Json.JsonTokenType)\n\tvoid System.Text.Json.JsonDocument:CheckSupportedOptions (System.Text.Json.JsonReaderOptions,string)\n\tvoid System.Text.Json.JsonDocument:Parse (System.ReadOnlySpan`1<byte>,System.Text.Json.JsonReaderOptions,System.Text.Json.JsonDocument/MetadataDb&,System.Text.Json.JsonDocument/StackRowStack&)\n\tvoid System.Text.Json.JsonDocument/DbRow:.ctor (System.Text.Json.JsonTokenType,int,int)\n\tvoid System.Text.Json.JsonDocument/MetadataDb:.ctor (byte[],bool,bool)\n\tvoid System.Text.Json.JsonDocument/MetadataDb:Append (System.Text.Json.JsonTokenType,int,int)\n\tvoid System.Text.Json.JsonDocument/MetadataDb:CompleteAllocations ()\n\tvoid System.Text.Json.JsonEncodedText:.ctor (byte[])\n\tvoid System.Text.Json.JsonHelpers:.cctor ()\n\tvoid System.Text.Json.JsonNamingPolicy:.cctor ()\n\tvoid System.Text.Json.JsonNamingPolicy:.ctor ()\n\tvoid System.Text.Json.JsonPropertyDictionary`1<System.Text.Json.Serialization.Metadata.JsonPropertyInfo>:.ctor (bool,int)\n\tvoid System.Text.Json.JsonReaderHelper:.cctor ()\n\tvoid System.Text.Json.JsonReaderOptions:set_CommentHandling (System.Text.Json.JsonCommentHandling)\n\tvoid System.Text.Json.JsonReaderOptions:set_MaxDepth (int)\n\tvoid System.Text.Json.JsonReaderState:.ctor (System.Text.Json.JsonReaderOptions)\n\tvoid System.Text.Json.JsonSerializer:.cctor ()\n\tvoid System.Text.Json.JsonSerializer:WriteCore (System.Text.Json.Utf8JsonWriter,object[]&,System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<object[]>)\n\tvoid System.Text.Json.JsonSerializerOptions:.ctor ()\n\tvoid System.Text.Json.JsonSerializerOptions:CheckConverterNullabilityIsSameAsPropertyType (System.Text.Json.Serialization.JsonConverter,System.Type)\n\tvoid System.Text.Json.JsonSerializerOptions:InitializeForReflectionSerializer ()\n\tvoid System.Text.Json.JsonSerializerOptions:set_MaxDepth (int)\n\tvoid System.Text.Json.JsonSerializerOptions:set_PropertyNameCaseInsensitive (bool)\n\tvoid System.Text.Json.JsonSerializerOptions:set_PropertyNamingPolicy (System.Text.Json.JsonNamingPolicy)\n\tvoid System.Text.Json.JsonSerializerOptions:TrackOptionsInstance (System.Text.Json.JsonSerializerOptions)\n\tvoid System.Text.Json.JsonSerializerOptions:VerifyMutable ()\n\tvoid System.Text.Json.JsonSerializerOptions/CachingContext:.ctor (System.Text.Json.JsonSerializerOptions,int)\n\tvoid System.Text.Json.JsonSerializerOptions/ConverterList:.ctor (System.Text.Json.JsonSerializerOptions,System.Collections.Generic.IList`1<System.Text.Json.Serialization.JsonConverter>)\n\tvoid System.Text.Json.JsonSerializerOptions/ConverterList:VerifyMutable ()\n\tvoid System.Text.Json.JsonSerializerOptions/EqualityComparer:<GetHashCode>g__AddHashCode|1_1 (System.HashCode&,bool)\n\tvoid System.Text.Json.JsonSerializerOptions/EqualityComparer:<GetHashCode>g__AddHashCode|1_1 (System.HashCode&,int)\n\tvoid System.Text.Json.JsonSerializerOptions/EqualityComparer:<GetHashCode>g__AddHashCode|1_1 (System.HashCode&,System.Text.Json.JsonCommentHandling)\n\tvoid System.Text.Json.JsonSerializerOptions/EqualityComparer:<GetHashCode>g__AddHashCode|1_1 (System.HashCode&,System.Text.Json.JsonNamingPolicy)\n\tvoid System.Text.Json.JsonSerializerOptions/EqualityComparer:<GetHashCode>g__AddHashCode|1_1 (System.HashCode&,System.Text.Json.Serialization.JsonIgnoreCondition)\n\tvoid System.Text.Json.JsonSerializerOptions/EqualityComparer:<GetHashCode>g__AddHashCode|1_1 (System.HashCode&,System.Text.Json.Serialization.JsonNumberHandling)\n\tvoid System.Text.Json.JsonSerializerOptions/EqualityComparer:<GetHashCode>g__AddHashCode|1_1 (System.HashCode&,System.Text.Json.Serialization.JsonUnknownTypeHandling)\n\tvoid System.Text.Json.JsonSerializerOptions/EqualityComparer:<GetHashCode>g__AddListHashCode|1_0 (System.HashCode&,System.Text.Json.Serialization.ConfigurationList`1<System.Text.Json.Serialization.JsonConverter>)\n\tvoid System.Text.Json.JsonSerializerOptions/TrackedCachingContexts:.cctor ()\n\tvoid System.Text.Json.JsonSerializerOptions/TrackedOptionsInstances:.cctor ()\n\tvoid System.Text.Json.JsonWriterHelper:.cctor ()\n\tvoid System.Text.Json.JsonWriterHelper:EscapeNextChars (char,System.Span`1<char>,int&)\n\tvoid System.Text.Json.JsonWriterHelper:EscapeString (System.ReadOnlySpan`1<char>,System.Span`1<char>,int,System.Text.Encodings.Web.JavaScriptEncoder,int&)\n\tvoid System.Text.Json.JsonWriterOptions:set_Indented (bool)\n\tvoid System.Text.Json.JsonWriterOptions:set_MaxDepth (int)\n\tvoid System.Text.Json.JsonWriterOptions:set_SkipValidation (bool)\n\tvoid System.Text.Json.PooledByteBufferWriter:Advance (int)\n\tvoid System.Text.Json.PooledByteBufferWriter:CheckAndResizeBuffer (int)\n\tvoid System.Text.Json.PooledByteBufferWriter:ClearAndReturnBuffers ()\n\tvoid System.Text.Json.PooledByteBufferWriter:ClearHelper ()\n\tvoid System.Text.Json.PooledByteBufferWriter:InitializeEmptyInstance (int)\n\tvoid System.Text.Json.ReadStack:.cctor ()\n\tvoid System.Text.Json.ReadStack:Initialize (System.Text.Json.Serialization.Metadata.JsonTypeInfo,bool)\n\tvoid System.Text.Json.ReadStack:Pop (bool)\n\tvoid System.Text.Json.ReadStack:Push ()\n\tvoid System.Text.Json.ReadStack:SetConstructorArgumentState ()\n\tvoid System.Text.Json.Reflection.ReflectionExtensions:.cctor ()\n\tvoid System.Text.Json.Serialization.ConfigurationList`1<System.Text.Json.Serialization.JsonConverter>:.ctor (System.Collections.Generic.IList`1<System.Text.Json.Serialization.JsonConverter>)\n\tvoid System.Text.Json.Serialization.ConfigurationList`1<System.Text.Json.Serialization.JsonConverter>:Add (System.Text.Json.Serialization.JsonConverter)\n\tvoid System.Text.Json.Serialization.ConfigurationList`1<System.Text.Json.Serialization.JsonConverter>:OnAddingElement (System.Text.Json.Serialization.JsonConverter)\n\tvoid System.Text.Json.Serialization.Converters.BooleanConverter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.ByteArrayConverter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.ByteConverter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.CharConverter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.DateOnlyConverter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.DateTimeConverter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.DateTimeOffsetConverter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.DecimalConverter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.DoubleConverter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.EnumConverter`1<Microsoft.JSInterop.JSCallResultType>:.cctor ()\n\tvoid System.Text.Json.Serialization.Converters.EnumConverter`1<Microsoft.JSInterop.JSCallResultType>:.ctor (System.Text.Json.Serialization.Converters.EnumConverterOptions,System.Text.Json.JsonNamingPolicy,System.Text.Json.JsonSerializerOptions)\n\tvoid System.Text.Json.Serialization.Converters.EnumConverter`1<Microsoft.JSInterop.JSCallResultType>:Write (System.Text.Json.Utf8JsonWriter,Microsoft.JSInterop.JSCallResultType,System.Text.Json.JsonSerializerOptions)\n\tvoid System.Text.Json.Serialization.Converters.GuidConverter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.IDictionaryConverter`1<System.Collections.IDictionary>:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.IEnumerableConverter`1<System.Collections.IEnumerable>:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.IEnumerableConverterFactory:.cctor ()\n\tvoid System.Text.Json.Serialization.Converters.IEnumerableConverterFactory:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.IEnumerableOfTConverter`2<System.Collections.Generic.IEnumerable`1<System.Object>, System.Object>:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.IListConverter`1<System.Collections.IList>:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.Int16Converter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.Int32Converter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.Int32Converter:Write (System.Text.Json.Utf8JsonWriter,int,System.Text.Json.JsonSerializerOptions)\n\tvoid System.Text.Json.Serialization.Converters.Int64Converter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.Int64Converter:Write (System.Text.Json.Utf8JsonWriter,long,System.Text.Json.JsonSerializerOptions)\n\tvoid System.Text.Json.Serialization.Converters.JsonDocumentConverter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.JsonElementConverter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.ListOfTConverter`2<System.Collections.Generic.List`1<System.String>, System.String>:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.ObjectConverter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.SByteConverter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.SingleConverter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.StringConverter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.StringConverter:Write (System.Text.Json.Utf8JsonWriter,string,System.Text.Json.JsonSerializerOptions)\n\tvoid System.Text.Json.Serialization.Converters.TimeOnlyConverter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.TimeSpanConverter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.UInt16Converter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.UInt32Converter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.UInt64Converter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.UriConverter:.ctor ()\n\tvoid System.Text.Json.Serialization.Converters.VersionConverter:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonCollectionConverter`2<System.Collections.IEnumerable, System.Object>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter:ConfigureJsonTypeInfo (System.Text.Json.Serialization.Metadata.JsonTypeInfo,System.Text.Json.JsonSerializerOptions)\n\tvoid System.Text.Json.Serialization.JsonConverter:ConfigureJsonTypeInfoUsingReflection (System.Text.Json.Serialization.Metadata.JsonTypeInfo,System.Text.Json.JsonSerializerOptions)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<Microsoft.AspNetCore.Components.ElementReference>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<Microsoft.AspNetCore.Components.ElementReference>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<Microsoft.AspNetCore.Components.ElementReference>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<Microsoft.JSInterop.DotNetObjectReference`1<Microsoft.AspNetCore.Components.RenderTree.WebRenderer/WebRendererInteropMethods>>:VerifyWrite (int,System.Text.Json.Utf8JsonWriter)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<Microsoft.JSInterop.JSCallResultType>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<Microsoft.JSInterop.JSCallResultType>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<Microsoft.JSInterop.JSCallResultType>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<Microsoft.JSInterop.JSCallResultType>:VerifyWrite (int,System.Text.Json.Utf8JsonWriter)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Boolean>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Boolean>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Boolean>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Byte>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Byte>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Byte>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Char>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Char>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Char>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Collections.IDictionary>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Collections.IDictionary>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Collections.IDictionary>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.DateOnly>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.DateOnly>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.DateOnly>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.DateTime>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.DateTime>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.DateTime>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.DateTimeOffset>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.DateTimeOffset>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.DateTimeOffset>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Decimal>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Decimal>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Decimal>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Double>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Double>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Double>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Guid>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Guid>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Guid>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Int16>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Int16>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Int16>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Int32>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Int32>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Int32>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Int32>:VerifyWrite (int,System.Text.Json.Utf8JsonWriter)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Int64>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Int64>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Int64>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Int64>:VerifyWrite (int,System.Text.Json.Utf8JsonWriter)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.SByte>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.SByte>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.SByte>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Single>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Single>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Single>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Text.Json.JsonElement>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Text.Json.JsonElement>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.Text.Json.JsonElement>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.TimeOnly>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.TimeOnly>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.TimeOnly>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.TimeSpan>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.TimeSpan>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.TimeSpan>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.UInt16>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.UInt16>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.UInt16>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.UInt32>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.UInt32>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.UInt32>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.UInt64>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.UInt64>:.ctor (bool)\n\tvoid System.Text.Json.Serialization.JsonConverter`1<System.UInt64>:Initialize ()\n\tvoid System.Text.Json.Serialization.JsonDictionaryConverter`1<System.Collections.IDictionary>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonDictionaryConverter`3<System.Collections.IDictionary, System.String, System.Object>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonObjectConverter`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>:.ctor ()\n\tvoid System.Text.Json.Serialization.JsonResumableConverter`1<System.Collections.IDictionary>:.ctor ()\n\tvoid System.Text.Json.Serialization.Metadata.DefaultJsonTypeInfoResolver:.ctor (bool)\n\tvoid System.Text.Json.Serialization.Metadata.DefaultJsonTypeInfoResolver:<GetDefaultSimpleConverters>g__Add|3_0 (System.Text.Json.Serialization.JsonConverter,System.Text.Json.Serialization.Metadata.DefaultJsonTypeInfoResolver/<>c__DisplayClass3_0&)\n\tvoid System.Text.Json.Serialization.Metadata.JsonPropertyInfo:.cctor ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonPropertyInfo:.ctor (System.Type,System.Type,System.Text.Json.Serialization.Metadata.JsonTypeInfo,System.Text.Json.JsonSerializerOptions)\n\tvoid System.Text.Json.Serialization.Metadata.JsonPropertyInfo:Configure ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonPropertyInfo:DetermineNumberHandlingForTypeInfo ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonPropertyInfo:EnsureChildOf (System.Text.Json.Serialization.Metadata.JsonTypeInfo)\n\tvoid System.Text.Json.Serialization.Metadata.JsonPropertyInfo:EnsureConfigured ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonPropertyInfo:set_IsForTypeInfo (bool)\n\tvoid System.Text.Json.Serialization.Metadata.JsonPropertyInfo:set_JsonTypeInfo (System.Text.Json.Serialization.Metadata.JsonTypeInfo)\n\tvoid System.Text.Json.Serialization.Metadata.JsonPropertyInfo:set_Name (string)\n\tvoid System.Text.Json.Serialization.Metadata.JsonPropertyInfo:set_ParentTypeInfo (System.Text.Json.Serialization.Metadata.JsonTypeInfo)\n\tvoid System.Text.Json.Serialization.Metadata.JsonPropertyInfo:VerifyMutable ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1<Microsoft.JSInterop.JSCallResultType>:.ctor (System.Type,System.Text.Json.Serialization.Metadata.JsonTypeInfo,System.Text.Json.JsonSerializerOptions)\n\tvoid System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1<Microsoft.JSInterop.JSCallResultType>:DetermineEffectiveConverter (System.Text.Json.Serialization.Metadata.JsonTypeInfo)\n\tvoid System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1<System.Int32>:.ctor (System.Type,System.Text.Json.Serialization.Metadata.JsonTypeInfo,System.Text.Json.JsonSerializerOptions)\n\tvoid System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1<System.Int32>:DetermineEffectiveConverter (System.Text.Json.Serialization.Metadata.JsonTypeInfo)\n\tvoid System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1<System.Int64>:.ctor (System.Type,System.Text.Json.Serialization.Metadata.JsonTypeInfo,System.Text.Json.JsonSerializerOptions)\n\tvoid System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1<System.Int64>:DetermineEffectiveConverter (System.Text.Json.Serialization.Metadata.JsonTypeInfo)\n\tvoid System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1<System.Text.Json.JsonElement>:.ctor (System.Type,System.Text.Json.Serialization.Metadata.JsonTypeInfo,System.Text.Json.JsonSerializerOptions)\n\tvoid System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1<System.Text.Json.JsonElement>:DetermineEffectiveConverter (System.Text.Json.Serialization.Metadata.JsonTypeInfo)\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo:.cctor ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo:.ctor (System.Type,System.Text.Json.Serialization.JsonConverter,System.Text.Json.JsonSerializerOptions)\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo:<EnsureConfigured>g__ConfigureLocked|143_0 ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo:Configure ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo:EnsureConfigured ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo:InitializePropertyCache ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo:ValidateType (System.Type)\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo/<>c:.cctor ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo/<>c:.ctor ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1/<>c<Microsoft.JSInterop.JSCallResultType>:.cctor ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1/<>c<Microsoft.JSInterop.JSCallResultType>:.ctor ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1/<>c<System.Int32>:.cctor ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1/<>c<System.Int32>:.ctor ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1/<>c<System.Int64>:.cctor ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1/<>c<System.Int64>:.ctor ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1/<>c<System.Text.Json.JsonElement>:.cctor ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1/<>c<System.Text.Json.JsonElement>:.ctor ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<Microsoft.JSInterop.JSCallResultType>:.ctor (System.Text.Json.Serialization.JsonConverter,System.Text.Json.JsonSerializerOptions)\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<Microsoft.JSInterop.JSCallResultType>:MapInterfaceTypesToCallbacks ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<Microsoft.JSInterop.JSCallResultType>:PopulatePolymorphismMetadata ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<Microsoft.JSInterop.JSCallResultType>:SetCreateObjectIfCompatible (System.Delegate)\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<System.Int32>:.ctor (System.Text.Json.Serialization.JsonConverter,System.Text.Json.JsonSerializerOptions)\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<System.Int32>:MapInterfaceTypesToCallbacks ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<System.Int32>:PopulatePolymorphismMetadata ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<System.Int32>:SetCreateObjectIfCompatible (System.Delegate)\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<System.Int64>:.ctor (System.Text.Json.Serialization.JsonConverter,System.Text.Json.JsonSerializerOptions)\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<System.Int64>:MapInterfaceTypesToCallbacks ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<System.Int64>:PopulatePolymorphismMetadata ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<System.Int64>:SetCreateObjectIfCompatible (System.Delegate)\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<System.Text.Json.JsonElement>:.ctor (System.Text.Json.Serialization.JsonConverter,System.Text.Json.JsonSerializerOptions)\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<System.Text.Json.JsonElement>:MapInterfaceTypesToCallbacks ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<System.Text.Json.JsonElement>:PopulatePolymorphismMetadata ()\n\tvoid System.Text.Json.Serialization.Metadata.JsonTypeInfo`1<System.Text.Json.JsonElement>:SetCreateObjectIfCompatible (System.Delegate)\n\tvoid System.Text.Json.Serialization.Metadata.ReflectionEmitCachingMemberAccessor:.cctor ()\n\tvoid System.Text.Json.Serialization.Metadata.ReflectionEmitCachingMemberAccessor:.ctor ()\n\tvoid System.Text.Json.Serialization.Metadata.ReflectionEmitCachingMemberAccessor/<>c:.cctor ()\n\tvoid System.Text.Json.Serialization.Metadata.ReflectionEmitCachingMemberAccessor/<>c:.ctor ()\n\tvoid System.Text.Json.Serialization.Metadata.ReflectionEmitCachingMemberAccessor/Cache`1<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>:.ctor (System.TimeSpan,System.TimeSpan)\n\tvoid System.Text.Json.Serialization.Metadata.ReflectionEmitCachingMemberAccessor/Cache`1<System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>>:EvictStaleCacheEntries (long)\n\tvoid System.Text.Json.Serialization.Metadata.ReflectionJsonTypeInfo`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>:LateAddProperties ()\n\tvoid System.Text.Json.Serialization.Metadata.ReflectionJsonTypeInfo`1<Microsoft.JSInterop.JSCallResultType>:.ctor (System.Text.Json.Serialization.JsonConverter,System.Text.Json.JsonSerializerOptions)\n\tvoid System.Text.Json.Serialization.Metadata.ReflectionJsonTypeInfo`1<System.Int32>:.ctor (System.Text.Json.Serialization.JsonConverter,System.Text.Json.JsonSerializerOptions)\n\tvoid System.Text.Json.Serialization.Metadata.ReflectionJsonTypeInfo`1<System.Int64>:.ctor (System.Text.Json.Serialization.JsonConverter,System.Text.Json.JsonSerializerOptions)\n\tvoid System.Text.Json.Serialization.Metadata.ReflectionJsonTypeInfo`1<System.Text.Json.JsonElement>:.ctor (System.Text.Json.Serialization.JsonConverter,System.Text.Json.JsonSerializerOptions)\n\tvoid System.Text.Json.Utf8JsonReader:.ctor (System.ReadOnlySpan`1<byte>,bool,System.Text.Json.JsonReaderState)\n\tvoid System.Text.Json.Utf8JsonReader:.ctor (System.ReadOnlySpan`1<byte>,System.Text.Json.JsonReaderOptions)\n\tvoid System.Text.Json.Utf8JsonReader:EndArray ()\n\tvoid System.Text.Json.Utf8JsonWriter:.cctor ()\n\tvoid System.Text.Json.Utf8JsonWriter:.ctor ()\n\tvoid System.Text.Json.Utf8JsonWriter:CheckNotDisposed ()\n\tvoid System.Text.Json.Utf8JsonWriter:FirstCallToGetMemory (int)\n\tvoid System.Text.Json.Utf8JsonWriter:Flush ()\n\tvoid System.Text.Json.Utf8JsonWriter:Grow (int)\n\tvoid System.Text.Json.Utf8JsonWriter:Reset (System.Buffers.IBufferWriter`1<byte>,System.Text.Json.JsonWriterOptions)\n\tvoid System.Text.Json.Utf8JsonWriter:ResetAllStateForCacheReuse ()\n\tvoid System.Text.Json.Utf8JsonWriter:ResetHelper ()\n\tvoid System.Text.Json.Utf8JsonWriter:WriteEnd (byte)\n\tvoid System.Text.Json.Utf8JsonWriter:WriteEndArray ()\n\tvoid System.Text.Json.Utf8JsonWriter:WriteEndMinimized (byte)\n\tvoid System.Text.Json.Utf8JsonWriter:WriteEndObject ()\n\tvoid System.Text.Json.Utf8JsonWriter:WriteNumber (System.Text.Json.JsonEncodedText,long)\n\tvoid System.Text.Json.Utf8JsonWriter:WriteNumberByOptions (System.ReadOnlySpan`1<byte>,long)\n\tvoid System.Text.Json.Utf8JsonWriter:WriteNumberMinimized (System.ReadOnlySpan`1<byte>,long)\n\tvoid System.Text.Json.Utf8JsonWriter:WriteNumberValue (int)\n\tvoid System.Text.Json.Utf8JsonWriter:WriteNumberValue (long)\n\tvoid System.Text.Json.Utf8JsonWriter:WriteNumberValueMinimized (long)\n\tvoid System.Text.Json.Utf8JsonWriter:WriteStart (byte)\n\tvoid System.Text.Json.Utf8JsonWriter:WriteStartArray ()\n\tvoid System.Text.Json.Utf8JsonWriter:WriteStartMinimized (byte)\n\tvoid System.Text.Json.Utf8JsonWriter:WriteStartObject ()\n\tvoid System.Text.Json.Utf8JsonWriter:WriteStringByOptions (System.ReadOnlySpan`1<char>)\n\tvoid System.Text.Json.Utf8JsonWriter:WriteStringEscape (System.ReadOnlySpan`1<char>)\n\tvoid System.Text.Json.Utf8JsonWriter:WriteStringEscapeValue (System.ReadOnlySpan`1<char>,int)\n\tvoid System.Text.Json.Utf8JsonWriter:WriteStringMinimized (System.ReadOnlySpan`1<char>)\n\tvoid System.Text.Json.Utf8JsonWriter:WriteStringValue (System.ReadOnlySpan`1<char>)\n\tvoid System.Text.Json.Utf8JsonWriterCache:ReturnWriterAndBuffer (System.Text.Json.Utf8JsonWriter,System.Text.Json.PooledByteBufferWriter)\n\tvoid System.Text.Json.Utf8JsonWriterCache/ThreadLocalState:.ctor ()\n\tvoid System.Text.Json.WriteStack:EnsurePushCapacity ()\n\tvoid System.Text.Json.WriteStack:Initialize (System.Text.Json.Serialization.Metadata.JsonTypeInfo,bool,bool)\n\tvoid System.Text.Json.WriteStack:Pop (bool)\n\tvoid System.Text.Json.WriteStack:Push ()\n\tvoid System.Text.Rune:.ctor (int)\n\tvoid System.Text.Rune:.ctor (uint)\n\tvoid System.Text.StringBuilder:.ctor ()\n\tvoid System.Text.StringBuilder:.ctor (int,int)\n\tvoid System.Text.StringBuilder:.ctor (int)\n\tvoid System.Text.StringBuilder:.ctor (System.Text.StringBuilder)\n\tvoid System.Text.StringBuilder:Append (char&,int)\n\tvoid System.Text.StringBuilder:AppendWithExpansion (char&,int)\n\tvoid System.Text.StringBuilder:ExpandByABlock (int)\n\tvoid System.Text.StringBuilder:set_Length (int)\n\tvoid System.Text.StringBuilderCache:Release (System.Text.StringBuilder)\n\tvoid System.Text.Unicode.UnicodeRange:.ctor (int,int)\n\tvoid System.Text.UTF8Encoding:.cctor ()\n\tvoid System.Text.UTF8Encoding:.ctor ()\n\tvoid System.Text.UTF8Encoding:.ctor (bool,bool)\n\tvoid System.Text.UTF8Encoding:.ctor (bool)\n\tvoid System.Text.UTF8Encoding:SetDefaultFallbacks ()\n\tvoid System.Text.UTF8Encoding/UTF8EncodingSealed:.ctor (bool)\n\tvoid System.Text.ValueStringBuilder:.ctor (System.Span`1<char>)\n\tvoid System.Text.ValueStringBuilder:.ctor (System.Span`1<char>)\n\tvoid System.Text.ValueStringBuilder:.ctor (System.Span`1<char>)\n\tvoid System.Text.ValueStringBuilder:Append (System.ReadOnlySpan`1<char>)\n\tvoid System.Text.ValueStringBuilder:Append (System.ReadOnlySpan`1<char>)\n\tvoid System.Text.ValueStringBuilder:EnsureCapacity (int)\n\tvoid System.Text.ValueUtf8Converter:Dispose ()\n\tvoid System.Threading.AutoResetEvent:.ctor (bool)\n\tvoid System.Threading.CancellationTokenSource:.cctor ()\n\tvoid System.Threading.CancellationTokenSource:.ctor ()\n\tvoid System.Threading.CancellationTokenSource/Registrations:.ctor (System.Threading.CancellationTokenSource)\n\tvoid System.Threading.CancellationTokenSource/Registrations:EnterLock ()\n\tvoid System.Threading.EventWaitHandle:.ctor (bool,System.Threading.EventResetMode,string,bool&)\n\tvoid System.Threading.EventWaitHandle:.ctor (bool,System.Threading.EventResetMode)\n\tvoid System.Threading.EventWaitHandle:CreateEventCore (bool,System.Threading.EventResetMode,string,bool&)\n\tvoid System.Threading.ExecutionContext:.cctor ()\n\tvoid System.Threading.ExecutionContext:.ctor ()\n\tvoid System.Threading.ExecutionContext:RunInternal (System.Threading.ExecutionContext,System.Threading.ContextCallback,object)\n\tvoid System.Threading.LowLevelLifoSemaphore:.ctor (int,int,int,System.Action)\n\tvoid System.Threading.LowLevelLifoSemaphore:Create (int)\n\tvoid System.Threading.LowLevelLifoSemaphore:Release (int)\n\tvoid System.Threading.LowLevelLifoSemaphore:ReleaseCore (int)\n\tvoid System.Threading.LowLevelLifoSemaphore:ReleaseInternal (intptr,int)\n\tvoid System.Threading.LowLevelLifoSemaphore/Counts:AddUpToMaxCountOfWaitersSignaledToWake (uint)\n\tvoid System.Threading.LowLevelLifoSemaphore/Counts:DecrementCountOfWaitersSignaledToWake ()\n\tvoid System.Threading.LowLevelLifoSemaphore/Counts:DecrementSpinnerCount ()\n\tvoid System.Threading.LowLevelLifoSemaphore/Counts:DecrementWaiterCount ()\n\tvoid System.Threading.LowLevelLifoSemaphore/Counts:IncrementSpinnerCount ()\n\tvoid System.Threading.LowLevelLifoSemaphore/Counts:IncrementWaiterCount ()\n\tvoid System.Threading.LowLevelLifoSemaphore/Counts:set_SignalCount (uint)\n\tvoid System.Threading.LowLevelLifoSemaphore/Counts:SetUInt32Value (uint,byte)\n\tvoid System.Threading.LowLevelLock:.cctor ()\n\tvoid System.Threading.LowLevelLock:.ctor ()\n\tvoid System.Threading.LowLevelLock:Acquire ()\n\tvoid System.Threading.LowLevelLock:Release ()\n\tvoid System.Threading.LowLevelMonitor:Acquire ()\n\tvoid System.Threading.LowLevelMonitor:AcquireCore ()\n\tvoid System.Threading.LowLevelMonitor:Initialize ()\n\tvoid System.Threading.LowLevelMonitor:Release ()\n\tvoid System.Threading.LowLevelMonitor:ReleaseCore ()\n\tvoid System.Threading.LowLevelMonitor:Wait ()\n\tvoid System.Threading.LowLevelMonitor:WaitCore ()\n\tvoid System.Threading.LowLevelSpinWaiter:Wait (int,int,int)\n\tvoid System.Threading.Monitor:Exit (object)\n\tvoid System.Threading.PortableThreadPool:.cctor ()\n\tvoid System.Threading.PortableThreadPool:.ctor ()\n\tvoid System.Threading.PortableThreadPool:AdjustMaxWorkersActive ()\n\tvoid System.Threading.PortableThreadPool:NotifyWorkItemProgress (object,int)\n\tvoid System.Threading.PortableThreadPool:RequestWorker ()\n\tvoid System.Threading.PortableThreadPool/BlockingConfig:.cctor ()\n\tvoid System.Threading.PortableThreadPool/GateThread:.cctor ()\n\tvoid System.Threading.PortableThreadPool/GateThread:CreateGateThread (System.Threading.PortableThreadPool)\n\tvoid System.Threading.PortableThreadPool/GateThread:EnsureRunning (System.Threading.PortableThreadPool)\n\tvoid System.Threading.PortableThreadPool/GateThread:EnsureRunningSlow (System.Threading.PortableThreadPool)\n\tvoid System.Threading.PortableThreadPool/GateThread:GateThreadStart ()\n\tvoid System.Threading.PortableThreadPool/HillClimbing:.cctor ()\n\tvoid System.Threading.PortableThreadPool/HillClimbing:.ctor ()\n\tvoid System.Threading.PortableThreadPool/HillClimbing:ChangeThreadCount (int,System.Threading.PortableThreadPool/HillClimbing/StateOrTransition)\n\tvoid System.Threading.PortableThreadPool/HillClimbing:ForceChange (int,System.Threading.PortableThreadPool/HillClimbing/StateOrTransition)\n\tvoid System.Threading.PortableThreadPool/HillClimbing:LogTransition (int,double,System.Threading.PortableThreadPool/HillClimbing/StateOrTransition)\n\tvoid System.Threading.PortableThreadPool/ThreadCounts:set_NumExistingThreads (int16)\n\tvoid System.Threading.PortableThreadPool/ThreadCounts:set_NumProcessingWork (int16)\n\tvoid System.Threading.PortableThreadPool/ThreadCounts:set_NumThreadsGoal (int16)\n\tvoid System.Threading.PortableThreadPool/ThreadCounts:SetInt16Value (int16,byte)\n\tvoid System.Threading.PortableThreadPool/WorkerThread:.cctor ()\n\tvoid System.Threading.PortableThreadPool/WorkerThread:MaybeAddWorkingWorker (System.Threading.PortableThreadPool)\n\tvoid System.Threading.PortableThreadPool/WorkerThread:RemoveWorkingWorker (System.Threading.PortableThreadPool)\n\tvoid System.Threading.PortableThreadPool/WorkerThread:WorkerThreadStart ()\n\tvoid System.Threading.QueueUserWorkItemCallbackDefaultContext:.ctor (System.Threading.WaitCallback,object)\n\tvoid System.Threading.QueueUserWorkItemCallbackDefaultContext:Execute ()\n\tvoid System.Threading.SpinLock:.ctor (bool)\n\tvoid System.Threading.SynchronizationContext:OperationCompleted ()\n\tvoid System.Threading.SynchronizationContext:OperationStarted ()\n\tvoid System.Threading.SynchronizationContext:SetSynchronizationContext (System.Threading.SynchronizationContext)\n\tvoid System.Threading.Tasks.AwaitTaskContinuation:.cctor ()\n\tvoid System.Threading.Tasks.AwaitTaskContinuation:.ctor (System.Action,bool)\n\tvoid System.Threading.Tasks.AwaitTaskContinuation:RunCallback (System.Threading.ContextCallback,object,System.Threading.Tasks.Task&)\n\tvoid System.Threading.Tasks.AwaitTaskContinuation/<>c:.cctor ()\n\tvoid System.Threading.Tasks.AwaitTaskContinuation/<>c:.ctor ()\n\tvoid System.Threading.Tasks.AwaitTaskContinuation/<>c:<.cctor>b__17_0 (object)\n\tvoid System.Threading.Tasks.SynchronizationContextAwaitTaskContinuation:.cctor ()\n\tvoid System.Threading.Tasks.SynchronizationContextAwaitTaskContinuation:.ctor (System.Threading.SynchronizationContext,System.Action,bool)\n\tvoid System.Threading.Tasks.SynchronizationContextAwaitTaskContinuation:Run (System.Threading.Tasks.Task,bool)\n\tvoid System.Threading.Tasks.SynchronizationContextAwaitTaskContinuation/<>c:.cctor ()\n\tvoid System.Threading.Tasks.SynchronizationContextAwaitTaskContinuation/<>c:.ctor ()\n\tvoid System.Threading.Tasks.Task:.cctor ()\n\tvoid System.Threading.Tasks.Task:.ctor ()\n\tvoid System.Threading.Tasks.Task:.ctor (bool,System.Threading.Tasks.TaskCreationOptions,System.Threading.CancellationToken)\n\tvoid System.Threading.Tasks.Task:.ctor (object,System.Threading.Tasks.TaskCreationOptions,bool)\n\tvoid System.Threading.Tasks.Task:AddCompletionAction (System.Threading.Tasks.ITaskCompletionAction,bool)\n\tvoid System.Threading.Tasks.Task:FinishContinuations ()\n\tvoid System.Threading.Tasks.Task:RunContinuations (object)\n\tvoid System.Threading.Tasks.Task:RunOrQueueCompletionAction (System.Threading.Tasks.ITaskCompletionAction,bool)\n\tvoid System.Threading.Tasks.Task:TaskConstructorCore (System.Delegate,object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.InternalTaskOptions,System.Threading.Tasks.TaskScheduler)\n\tvoid System.Threading.Tasks.Task:UnsafeSetContinuationForAwait (System.Runtime.CompilerServices.IAsyncStateMachineBox,bool)\n\tvoid System.Threading.Tasks.Task/<>c:.cctor ()\n\tvoid System.Threading.Tasks.Task/<>c:.ctor ()\n\tvoid System.Threading.Tasks.Task/WhenAllPromise:.ctor (System.Threading.Tasks.Task[])\n\tvoid System.Threading.Tasks.Task/WhenAllPromise:Invoke (System.Threading.Tasks.Task)\n\tvoid System.Threading.Tasks.Task`1<Microsoft.JSInterop.Infrastructure.IJSVoidResult>:.ctor (Microsoft.JSInterop.Infrastructure.IJSVoidResult)\n\tvoid System.Threading.Tasks.Task`1<System.Boolean>:.cctor ()\n\tvoid System.Threading.Tasks.Task`1<System.Boolean>:.ctor (bool,bool,System.Threading.Tasks.TaskCreationOptions,System.Threading.CancellationToken)\n\tvoid System.Threading.Tasks.Task`1<System.Int32>:.cctor ()\n\tvoid System.Threading.Tasks.Task`1<System.Int32>:.ctor (bool,int,System.Threading.Tasks.TaskCreationOptions,System.Threading.CancellationToken)\n\tvoid System.Threading.Tasks.Task`1<System.Object>:.cctor ()\n\tvoid System.Threading.Tasks.Task`1<System.Object>:.ctor ()\n\tvoid System.Threading.Tasks.Task`1<System.Object>:.ctor (bool,object,System.Threading.Tasks.TaskCreationOptions,System.Threading.CancellationToken)\n\tvoid System.Threading.Tasks.Task`1<System.Threading.Tasks.VoidTaskResult>:.cctor ()\n\tvoid System.Threading.Tasks.Task`1<System.Threading.Tasks.VoidTaskResult>:.ctor ()\n\tvoid System.Threading.Tasks.Task`1<System.Threading.Tasks.VoidTaskResult>:.ctor (bool,System.Threading.Tasks.VoidTaskResult,System.Threading.Tasks.TaskCreationOptions,System.Threading.CancellationToken)\n\tvoid System.Threading.Tasks.Task`1<System.Threading.Tasks.VoidTaskResult>:.ctor (System.Threading.Tasks.VoidTaskResult)\n\tvoid System.Threading.Tasks.Task`1<System.ValueTuple`4<System.Int32, System.Int32, System.Int32, System.Boolean>>:.cctor ()\n\tvoid System.Threading.Tasks.Task`1<System.ValueTuple`4<System.Int32, System.Int32, System.Int32, System.Boolean>>:.ctor (bool,System.ValueTuple`4<int, int, int, bool>,System.Threading.Tasks.TaskCreationOptions,System.Threading.CancellationToken)\n\tvoid System.Threading.Tasks.Task`1<System.ValueTuple`4<System.Int32, System.Int32, System.Int32, System.Boolean>>:.ctor (System.ValueTuple`4<int, int, int, bool>)\n\tvoid System.Threading.Tasks.TaskCache:.cctor ()\n\tvoid System.Threading.Tasks.TaskCompletionSource:.ctor ()\n\tvoid System.Threading.Tasks.TaskCompletionSource:.ctor (object,System.Threading.Tasks.TaskCreationOptions)\n\tvoid System.Threading.Tasks.TaskCompletionSource:.ctor (System.Threading.Tasks.TaskCreationOptions)\n\tvoid System.Threading.Tasks.TaskCompletionSource:SetResult ()\n\tvoid System.Threading.Tasks.TaskCompletionSource`1<System.Object>:.ctor ()\n\tvoid System.Threading.Tasks.TaskCompletionSource`1<System.Object>:SetResult (object)\n\tvoid System.Threading.Tasks.TplEventSource:.cctor ()\n\tvoid System.Threading.Tasks.TplEventSource:.ctor ()\n\tvoid System.Threading.Thread:.ctor (System.Threading.ThreadStart,int)\n\tvoid System.Threading.Thread:.ctor (System.Threading.ThreadStart)\n\tvoid System.Threading.Thread:ClearWaitSleepJoinState ()\n\tvoid System.Threading.Thread:ClrState (System.Threading.Thread,System.Threading.ThreadState)\n\tvoid System.Threading.Thread:Initialize ()\n\tvoid System.Threading.Thread:InitInternal (System.Threading.Thread)\n\tvoid System.Threading.Thread:set_IsBackground (bool)\n\tvoid System.Threading.Thread:set_Name (string)\n\tvoid System.Threading.Thread:SetName (System.Threading.Thread,string)\n\tvoid System.Threading.Thread:SetName_icall (System.Threading.Thread,char*,int)\n\tvoid System.Threading.Thread:SetState (System.Threading.Thread,System.Threading.ThreadState)\n\tvoid System.Threading.Thread:SetThreadPoolWorkerThreadName ()\n\tvoid System.Threading.Thread:SetWaitSleepJoinState ()\n\tvoid System.Threading.Thread:SpinWait (int)\n\tvoid System.Threading.Thread:Start (bool,bool)\n\tvoid System.Threading.Thread:StartCallback ()\n\tvoid System.Threading.Thread:StartCore ()\n\tvoid System.Threading.Thread:StartInternal (System.Threading.Thread,int)\n\tvoid System.Threading.Thread:ThreadNameChanged (string)\n\tvoid System.Threading.Thread:UninterruptibleSleep0 ()\n\tvoid System.Threading.Thread:UnsafeStart ()\n\tvoid System.Threading.Thread/StartHelper:.cctor ()\n\tvoid System.Threading.Thread/StartHelper:.ctor (System.Delegate)\n\tvoid System.Threading.Thread/StartHelper:InitializeCulture ()\n\tvoid System.Threading.ThreadInt64PersistentCounter:.ctor ()\n\tvoid System.Threading.ThreadInt64PersistentCounter/ThreadLocalNode:.ctor (System.Threading.ThreadInt64PersistentCounter)\n\tvoid System.Threading.ThreadLocal`1/IdManager<Java.Interop.JniEnvironmentInfo>:.ctor ()\n\tvoid System.Threading.ThreadLocal`1<Java.Interop.JniEnvironmentInfo>:.cctor ()\n\tvoid System.Threading.ThreadLocal`1<Java.Interop.JniEnvironmentInfo>:.ctor (System.Func`1<Java.Interop.JniEnvironmentInfo>,bool)\n\tvoid System.Threading.ThreadLocal`1<Java.Interop.JniEnvironmentInfo>:CreateLinkedSlot (System.Threading.ThreadLocal`1/LinkedSlotVolatile<Java.Interop.JniEnvironmentInfo>[],int,Java.Interop.JniEnvironmentInfo)\n\tvoid System.Threading.ThreadLocal`1<Java.Interop.JniEnvironmentInfo>:Initialize (System.Func`1<Java.Interop.JniEnvironmentInfo>,bool)\n\tvoid System.Threading.ThreadLocal`1<Java.Interop.JniEnvironmentInfo>:set_Value (Java.Interop.JniEnvironmentInfo)\n\tvoid System.Threading.ThreadLocal`1<Java.Interop.JniEnvironmentInfo>:SetValueSlow (Java.Interop.JniEnvironmentInfo,System.Threading.ThreadLocal`1/LinkedSlotVolatile<Java.Interop.JniEnvironmentInfo>[])\n\tvoid System.Threading.ThreadPool:.cctor ()\n\tvoid System.Threading.ThreadPool:RequestWorkerThread ()\n\tvoid System.Threading.ThreadPool/<>c:.cctor ()\n\tvoid System.Threading.ThreadPool/<>c:.ctor ()\n\tvoid System.Threading.ThreadPoolWorkQueue:.cctor ()\n\tvoid System.Threading.ThreadPoolWorkQueue:.ctor ()\n\tvoid System.Threading.ThreadPoolWorkQueue:Enqueue (object,bool)\n\tvoid System.Threading.ThreadPoolWorkQueue/WorkStealingQueue:.ctor ()\n\tvoid System.Threading.ThreadPoolWorkQueue/WorkStealingQueueList:.cctor ()\n\tvoid System.Threading.ThreadPoolWorkQueue/WorkStealingQueueList:Add (System.Threading.ThreadPoolWorkQueue/WorkStealingQueue)\n\tvoid System.Threading.ThreadPoolWorkQueueThreadLocals:.ctor (System.Threading.ThreadPoolWorkQueue)\n\tvoid System.Threading.WaitHandle:.cctor ()\n\tvoid System.Threading.WaitHandle:.ctor ()\n\tvoid System.Threading.WaitSubsystem:.cctor ()\n\tvoid System.Threading.WaitSubsystem:UninterruptibleSleep0 ()\n\tvoid System.Threading.WaitSubsystem/LockHolder:.ctor (System.Threading.LowLevelLock)\n\tvoid System.Threading.WaitSubsystem/LockHolder:Dispose ()\n\tvoid System.Threading.WaitSubsystem/ThreadWaitInfo:.ctor (System.Threading.Thread)\n\tvoid System.Threading.WaitSubsystem/ThreadWaitInfo:RegisterWait (int,bool,bool)\n\tvoid System.Threading.WaitSubsystem/ThreadWaitInfo:UninterruptibleSleep0 ()\n\tvoid System.Threading.WaitSubsystem/ThreadWaitInfo:UnregisterWait ()\n\tvoid System.Threading.WaitSubsystem/WaitableObject:.ctor (System.Threading.WaitSubsystem/WaitableObject/WaitableObjectType,int,int,string,System.Threading.WaitSubsystem/WaitableObject/OwnershipInfo)\n\tvoid System.Threading.WaitSubsystem/WaitableObject:AcceptSignal (System.Threading.WaitSubsystem/ThreadWaitInfo)\n\tvoid System.TimeSpan:.cctor ()\n\tvoid System.TimeSpan:.ctor (long)\n\tvoid System.Type:.cctor ()\n\tvoid System.Type/<>c:.cctor ()\n\tvoid System.Type/<>c:.ctor ()\n\tvoid System.Uri:.cctor ()\n\tvoid System.Uri:.ctor (string,System.UriKind)\n\tvoid System.Uri:.ctor (string)\n\tvoid System.Uri:.ctor (System.Uri,string)\n\tvoid System.Uri:CreateHostString ()\n\tvoid System.Uri:CreateThis (string,bool,System.UriKind,System.UriCreationOptions&)\n\tvoid System.Uri:CreateUri (System.Uri,string,bool)\n\tvoid System.Uri:CreateUriInfo (System.Uri/Flags)\n\tvoid System.Uri:EnsureHostString (bool)\n\tvoid System.Uri:EnsureParseRemaining ()\n\tvoid System.Uri:GetCombinedString (System.Uri,string,bool,string&)\n\tvoid System.Uri:GetLengthWithoutTrailingSpaces (string,int&,int)\n\tvoid System.Uri:InitializeUri (System.ParsingError,System.UriKind,System.UriFormatException&)\n\tvoid System.Uri:InterlockedSetFlags (System.Uri/Flags)\n\tvoid System.Uri:ParseRemaining ()\n\tvoid System.Uri/<>c:.cctor ()\n\tvoid System.Uri/<>c:.ctor ()\n\tvoid System.UriHelper:.cctor ()\n\tvoid System.UriParser:.cctor ()\n\tvoid System.UriParser:.ctor (System.UriSyntaxFlags)\n\tvoid System.UriParser/BuiltInUriParser:.ctor (string,int,System.UriSyntaxFlags)\n\tvoid System.ValueTuple`3<System.String, System.Type, System.Reflection.MemberInfo>:.ctor (string,System.Type,System.Reflection.MemberInfo)\n\tvoid System.ValueTuple`4<System.Int32, System.Int32, System.Int32, System.Boolean>:.ctor (int,int,int,bool)\n\tvoid System.WeakReference`1<Java.Interop.IJavaPeerable>:.ctor (Java.Interop.IJavaPeerable,bool)\n\tvoid System.WeakReference`1<Java.Interop.IJavaPeerable>:Create (Java.Interop.IJavaPeerable,bool)\n\tvoid System.WeakReference`1<Microsoft.Extensions.DependencyInjection.ServiceProvider>:.ctor (Microsoft.Extensions.DependencyInjection.ServiceProvider)\n\tvoid System.Xml.Linq.XAttribute:.ctor (System.Xml.Linq.XName,object)\n\tvoid System.Xml.Linq.XAttribute:ValidateAttribute (System.Xml.Linq.XName,string)\n\tvoid System.Xml.Linq.XContainer:AddNodeSkipNotify (System.Xml.Linq.XNode)\n\tvoid System.Xml.Linq.XContainer:AddStringSkipNotify (string)\n\tvoid System.Xml.Linq.XContainer:AppendNodeSkipNotify (System.Xml.Linq.XNode)\n\tvoid System.Xml.Linq.XContainer:AppendText (System.Text.StringBuilder)\n\tvoid System.Xml.Linq.XContainer:ConvertTextToNode ()\n\tvoid System.Xml.Linq.XContainer:ReadContentFrom (System.Xml.XmlReader,System.Xml.Linq.LoadOptions)\n\tvoid System.Xml.Linq.XContainer:ReadContentFrom (System.Xml.XmlReader)\n\tvoid System.Xml.Linq.XContainer:ValidateString (string)\n\tvoid System.Xml.Linq.XContainer/<GetElements>d__39:.ctor (int)\n\tvoid System.Xml.Linq.XContainer/<GetElements>d__39:System.IDisposable.Dispose ()\n\tvoid System.Xml.Linq.XContainer/<Nodes>d__18:.ctor (int)\n\tvoid System.Xml.Linq.XContainer/<Nodes>d__18:System.IDisposable.Dispose ()\n\tvoid System.Xml.Linq.XDeclaration:.ctor (System.Xml.XmlReader)\n\tvoid System.Xml.Linq.XDocument:ValidateDocument (System.Xml.Linq.XNode,System.Xml.XmlNodeType,System.Xml.XmlNodeType)\n\tvoid System.Xml.Linq.XDocument:ValidateNode (System.Xml.Linq.XNode,System.Xml.Linq.XNode)\n\tvoid System.Xml.Linq.XElement:.ctor (System.Xml.Linq.XName)\n\tvoid System.Xml.Linq.XElement:AppendAttributeSkipNotify (System.Xml.Linq.XAttribute)\n\tvoid System.Xml.Linq.XElement:ValidateNode (System.Xml.Linq.XNode,System.Xml.Linq.XNode)\n\tvoid System.Xml.Linq.XHashtable`1/XHashtableState<System.Xml.Linq.XName>:.ctor (System.Xml.Linq.XHashtable`1/ExtractKeyDelegate<System.Xml.Linq.XName>,int)\n\tvoid System.Xml.Linq.XHashtable`1<System.Xml.Linq.XName>:.ctor (System.Xml.Linq.XHashtable`1/ExtractKeyDelegate<System.Xml.Linq.XName>,int)\n\tvoid System.Xml.Linq.XName:.ctor (System.Xml.Linq.XNamespace,string)\n\tvoid System.Xml.Linq.XNamespace:.ctor (string)\n\tvoid System.Xml.Linq.XText:.ctor (string)\n\tvoid System.Xml.Linq.XText:AppendText (System.Text.StringBuilder)\n\tvoid System.Xml.NameTable:.ctor ()\n\tvoid System.Xml.NameTable/Entry:.ctor (string,int,System.Xml.NameTable/Entry)\n\tvoid System.Xml.XmlConvert:.cctor ()\n\tvoid System.Xml.XmlNamespaceManager:.ctor (System.Xml.XmlNameTable)\n\tvoid System.Xml.XmlNamespaceManager:PushScope ()\n\tvoid System.Xml.XmlNamespaceManager/NamespaceDeclaration:Set (string,string,int,int)\n\tvoid System.Xml.XmlReader:Dispose ()\n\tvoid System.Xml.XmlReader:Dispose (bool)\n\tvoid System.Xml.XmlReaderSettings:.cctor ()\n\tvoid System.Xml.XmlReaderSettings:.ctor ()\n\tvoid System.Xml.XmlReaderSettings:CheckReadOnly (string)\n\tvoid System.Xml.XmlReaderSettings:Initialize (System.Xml.XmlResolver)\n\tvoid System.Xml.XmlReaderSettings:set_DtdProcessing (System.Xml.DtdProcessing)\n\tvoid System.Xml.XmlReaderSettings:set_IgnoreWhitespace (bool)\n\tvoid System.Xml.XmlReaderSettings:set_IsXmlResolverSet (bool)\n\tvoid System.Xml.XmlReaderSettings:set_MaxCharactersFromEntities (long)\n\tvoid System.Xml.XmlReaderSettings:set_ReadOnly (bool)\n\tvoid System.Xml.XmlTextReaderImpl:.ctor (System.IO.Stream,byte[],int,System.Xml.XmlReaderSettings,System.Uri,string,System.Xml.XmlParserContext,bool)\n\tvoid System.Xml.XmlTextReaderImpl:.ctor (System.Xml.XmlResolver,System.Xml.XmlReaderSettings,System.Xml.XmlParserContext)\n\tvoid System.Xml.XmlTextReaderImpl:Close ()\n\tvoid System.Xml.XmlTextReaderImpl:Close (bool)\n\tvoid System.Xml.XmlTextReaderImpl:ConvertAbsoluteUnixPathToAbsoluteUri (string&,System.Xml.XmlResolver)\n\tvoid System.Xml.XmlTextReaderImpl:EatPreamble ()\n\tvoid System.Xml.XmlTextReaderImpl:ElementNamespaceLookup ()\n\tvoid System.Xml.XmlTextReaderImpl:FinishInitStream ()\n\tvoid System.Xml.XmlTextReaderImpl:InitStreamInput (System.Uri,string,System.IO.Stream,byte[],int,System.Text.Encoding)\n\tvoid System.Xml.XmlTextReaderImpl:OnEof ()\n\tvoid System.Xml.XmlTextReaderImpl:ParseAttributes ()\n\tvoid System.Xml.XmlTextReaderImpl:ParseElement ()\n\tvoid System.Xml.XmlTextReaderImpl:ParseEndElement ()\n\tvoid System.Xml.XmlTextReaderImpl:PopElementContext ()\n\tvoid System.Xml.XmlTextReaderImpl:RegisterConsumedCharacters (long,bool)\n\tvoid System.Xml.XmlTextReaderImpl:ResetAttributes ()\n\tvoid System.Xml.XmlTextReaderImpl:SetupEncoding (System.Text.Encoding)\n\tvoid System.Xml.XmlTextReaderImpl:SwitchEncoding (System.Text.Encoding)\n\tvoid System.Xml.XmlTextReaderImpl/NodeData:.ctor ()\n\tvoid System.Xml.XmlTextReaderImpl/NodeData:Clear (System.Xml.XmlNodeType)\n\tvoid System.Xml.XmlTextReaderImpl/NodeData:ClearName ()\n\tvoid System.Xml.XmlTextReaderImpl/NodeData:SetNamedNode (System.Xml.XmlNodeType,string,string,string)\n\tvoid System.Xml.XmlTextReaderImpl/NodeData:SetNamedNode (System.Xml.XmlNodeType,string)\n\tvoid System.Xml.XmlTextReaderImpl/NodeData:SetValue (char[],int,int)\n\tvoid System.Xml.XmlTextReaderImpl/NodeData:SetValueNode (System.Xml.XmlNodeType,char[],int,int)\n\tvoid System.Xml.XmlTextReaderImpl/ParsingState:Close (bool)\n\tvoid System.Xml.XmlTextReaderImpl/XmlContext:.ctor ()\n"
  },
  {
    "path": "src/Spice/MSBuild/spice.aotprofile.txt",
    "content": "Methods:\n\tAndroid.App.Activity Java.Lang.Object:_GetObject (intptr,Android.Runtime.JniHandleOwnership)\n\tAndroid.App.Activity Java.Lang.Object:GetObject (intptr,Android.Runtime.JniHandleOwnership)\n\tAndroid.App.Activity Java.Lang.Object:GetObject (intptr,intptr,Android.Runtime.JniHandleOwnership)\n\tAndroid.Graphics.Color Spice.PlatformExtensions:ToAndroidColor (Microsoft.Maui.Graphics.Color)\n\tAndroid.Runtime.IdentityHashTargets& System.Collections.Generic.Dictionary`2<System.IntPtr, Android.Runtime.IdentityHashTargets>:FindValue (intptr)\n\tAndroid.Views.View Spice.View:op_Implicit (Spice.View)\n\tAndroid.Views.View Spice.View/<>c__DisplayClass15_0:<.ctor>b__0 ()\n\tAndroid.Views.View System.Lazy`1<Android.Views.View>:CreateValue ()\n\tAndroid.Views.View System.Lazy`1<Android.Views.View>:get_Value ()\n\tAndroid.Views.View/IOnClickListenerImplementor Android.Views.View:__CreateIOnClickListenerImplementor ()\n\tAndroid.Views.ViewGroup Spice.View:get_NativeView ()\n\tAndroid.Views.ViewGroup/LayoutParams Spice.Application:CreateLayoutParameters ()\n\tAndroid.Views.ViewGroup/LayoutParams Spice.View:CreateLayoutParameters ()\n\tAndroid.Widget.Button Spice.Button:Create (Android.Content.Context)\n\tAndroid.Widget.Button Spice.Button:get_NativeView ()\n\tAndroid.Widget.ImageView Spice.Image:Create (Android.Content.Context)\n\tAndroid.Widget.ImageView Spice.Image:get_NativeView ()\n\tAndroid.Widget.LinearLayout Spice.StackLayout:Create (Android.Content.Context)\n\tAndroid.Widget.RelativeLayout Spice.View:Create (Android.Content.Context)\n\tAndroid.Widget.TextView Spice.Label:Create (Android.Content.Context)\n\tAndroid.Widget.TextView Spice.Label:get_NativeView ()\n\tbool Android.Runtime.AndroidTypeManager:FastRegisterNativeMembers (Java.Interop.JniType,System.Type,System.ReadOnlySpan`1<char>)\n\tbool Android.Runtime.AndroidTypeManager/MagicRegistrationMap:get_Filled ()\n\tbool Android.Runtime.Logger:get_LogGlobalRef ()\n\tbool Android.Runtime.XAPeerMembers:UsesVirtualDispatch (Java.Interop.IJavaPeerable,System.Type)\n\tbool Java.Interop.JniEnvironment/Types:IsSameObject (Java.Interop.JniObjectReference,Java.Interop.JniObjectReference)\n\tbool Java.Interop.JniEnvironmentInfo:get_IsValid ()\n\tbool Java.Interop.JniPeerMembers/JniInstanceMethods:TryInvokeVoidStaticRedirect (Java.Interop.JniMethodInfo,Java.Interop.IJavaPeerable,Java.Interop.JniArgumentValue*)\n\tbool Java.Interop.JniRuntime/JniObjectReferenceManager:get_LogGlobalReferenceMessages ()\n\tbool Java.Interop.JniType:TryGetStaticMethod (string,string,Java.Interop.JniMethodInfo&)\n\tbool Java.Interop.TypeManager:get_ActivationEnabled ()\n\tbool Java.Lang.Object:Java.Interop.IJavaObjectEx.get_IsProxy ()\n\tbool Java.Lang.Object:Java.Interop.IJavaObjectEx.get_NeedsActivation ()\n\tbool System.AppContext:TryGetSwitch (string,bool&)\n\tbool System.AppContextConfigHelper:GetBooleanConfig (string,string,bool)\n\tbool System.Array:FastCopy (System.Array,int,System.Array,int,int)\n\tbool System.Boolean:IsFalseStringIgnoreCase (System.ReadOnlySpan`1<char>)\n\tbool System.Boolean:IsTrueStringIgnoreCase (System.ReadOnlySpan`1<char>)\n\tbool System.Boolean:TryParse (string,bool&)\n\tbool System.Boolean:TryParse (System.ReadOnlySpan`1<char>,bool&)\n\tbool System.Collections.Generic.Dictionary`2<System.Int32, System.Boolean>:TryInsert (int,bool,System.Collections.Generic.InsertionBehavior)\n\tbool System.Collections.Generic.Dictionary`2<System.IntPtr, Android.Runtime.IdentityHashTargets>:Remove (intptr)\n\tbool System.Collections.Generic.Dictionary`2<System.IntPtr, Android.Runtime.IdentityHashTargets>:TryGetValue (intptr,Android.Runtime.IdentityHashTargets&)\n\tbool System.Collections.Generic.Dictionary`2<System.IntPtr, Android.Runtime.IdentityHashTargets>:TryInsert (intptr,Android.Runtime.IdentityHashTargets,System.Collections.Generic.InsertionBehavior)\n\tbool System.Collections.Generic.Dictionary`2<System.IntPtr, Java.Interop.JniRuntime>:TryGetValue (intptr,Java.Interop.JniRuntime&)\n\tbool System.Collections.Generic.Dictionary`2<System.IntPtr, Java.Interop.JniRuntime>:TryInsert (intptr,Java.Interop.JniRuntime,System.Collections.Generic.InsertionBehavior)\n\tbool System.Collections.Generic.Dictionary`2<System.IntPtr, System.IDisposable>:ContainsKey (intptr)\n\tbool System.Collections.Generic.Dictionary`2<System.IntPtr, System.IDisposable>:TryInsert (intptr,System.IDisposable,System.Collections.Generic.InsertionBehavior)\n\tbool System.Collections.Generic.Dictionary`2<System.String, System.IntPtr>:TryGetValue (string,intptr&)\n\tbool System.Collections.Generic.Dictionary`2<System.String, System.IntPtr>:TryInsert (string,intptr,System.Collections.Generic.InsertionBehavior)\n\tbool System.Collections.Generic.Dictionary`2<System.String, System.Object>:TryInsert (string,object,System.Collections.Generic.InsertionBehavior)\n\tbool System.Collections.Generic.Dictionary`2<System.String, System.Type>:TryGetValue (string,System.Type&)\n\tbool System.Collections.Generic.GenericEqualityComparer`1<System.String>:Equals (string,string)\n\tbool System.Collections.Generic.List`1<Spice.View>:System.Collections.Generic.ICollection<T>.get_IsReadOnly ()\n\tbool System.Collections.Generic.NonRandomizedStringEqualityComparer/OrdinalComparer:Equals (string,string)\n\tbool System.Collections.Generic.ObjectEqualityComparer`1<System.Action`1<Spice.Button>>:Equals (System.Action`1<Spice.Button>,System.Action`1<Spice.Button>)\n\tbool System.Collections.Specialized.SingleItemReadOnlyList/<GetEnumerator>d__15:MoveNext ()\n\tbool System.Delegate:IsReturnTypeMatch (System.Type,System.Type)\n\tbool System.Globalization.GlobalizationMode:get_Invariant ()\n\tbool System.Globalization.GlobalizationMode:TryGetAppLocalIcuSwitchValue (string&)\n\tbool System.Globalization.GlobalizationMode:TryGetStringValue (string,string,string&)\n\tbool System.Globalization.GlobalizationMode/Settings:get_Invariant ()\n\tbool System.Reflection.MethodBase:get_IsPublic ()\n\tbool System.Reflection.MethodBase:get_IsStatic ()\n\tbool System.RuntimeType:FilterApplyConstructorInfo (System.Reflection.RuntimeConstructorInfo,System.Reflection.BindingFlags,System.Reflection.CallingConventions,System.Type[])\n\tbool System.RuntimeType:FilterApplyMethodBase (System.Reflection.MethodBase,System.Reflection.BindingFlags,System.Reflection.CallingConventions,System.Type[])\n\tbool System.RuntimeType:FilterApplyMethodInfo (System.Reflection.RuntimeMethodInfo,System.Reflection.BindingFlags,System.Reflection.CallingConventions,System.Type[])\n\tbool System.RuntimeType:get_ContainsGenericParameters ()\n\tbool System.RuntimeType:get_IsByRefLike ()\n\tbool System.RuntimeType:get_IsEnum ()\n\tbool System.RuntimeType:get_IsGenericParameter ()\n\tbool System.RuntimeType:get_IsGenericType ()\n\tbool System.RuntimeType:get_IsGenericTypeDefinition ()\n\tbool System.RuntimeType:HasElementTypeImpl ()\n\tbool System.RuntimeType:IsAssignableFrom (System.Type)\n\tbool System.RuntimeType:IsByRefImpl ()\n\tbool System.RuntimeType:IsDelegate ()\n\tbool System.RuntimeType:IsInstanceOfType (object)\n\tbool System.RuntimeType:IsSubclassOf (System.Type)\n\tbool System.RuntimeType:IsValueTypeImpl ()\n\tbool System.RuntimeTypeHandle:CanCastTo (System.RuntimeType,System.RuntimeType)\n\tbool System.RuntimeTypeHandle:HasElementType (System.RuntimeType)\n\tbool System.RuntimeTypeHandle:HasInstantiation (System.Runtime.CompilerServices.QCallTypeHandle)\n\tbool System.RuntimeTypeHandle:HasInstantiation (System.RuntimeType)\n\tbool System.RuntimeTypeHandle:is_subclass_of (System.Runtime.CompilerServices.QCallTypeHandle,System.Runtime.CompilerServices.QCallTypeHandle)\n\tbool System.RuntimeTypeHandle:IsByRef (System.RuntimeType)\n\tbool System.RuntimeTypeHandle:IsByRefLike (System.Runtime.CompilerServices.QCallTypeHandle)\n\tbool System.RuntimeTypeHandle:IsByRefLike (System.RuntimeType)\n\tbool System.RuntimeTypeHandle:IsGenericTypeDefinition (System.Runtime.CompilerServices.QCallTypeHandle)\n\tbool System.RuntimeTypeHandle:IsGenericTypeDefinition (System.RuntimeType)\n\tbool System.RuntimeTypeHandle:IsGenericVariable (System.RuntimeType)\n\tbool System.RuntimeTypeHandle:IsInstanceOfType (System.Runtime.CompilerServices.QCallTypeHandle,object)\n\tbool System.RuntimeTypeHandle:IsInstanceOfType (System.RuntimeType,object)\n\tbool System.RuntimeTypeHandle:IsInterface (System.RuntimeType)\n\tbool System.RuntimeTypeHandle:IsSubclassOf (System.RuntimeType,System.RuntimeType)\n\tbool System.RuntimeTypeHandle:type_is_assignable_from (System.Runtime.CompilerServices.QCallTypeHandle,System.Runtime.CompilerServices.QCallTypeHandle)\n\tbool System.SpanHelpers:SequenceEqual (byte&,byte&,uintptr)\n\tbool System.String:Equals (string,string)\n\tbool System.String:Equals (string)\n\tbool System.String:op_Equality (string,string)\n\tbool System.Type:get_HasElementType ()\n\tbool System.Type:get_IsAbstract ()\n\tbool System.Type:get_IsByRef ()\n\tbool System.Type:get_IsInterface ()\n\tbool System.Type:get_IsValueType ()\n\tbool System.Type:op_Equality (System.Type,System.Type)\n\tbool System.Type:op_Inequality (System.Type,System.Type)\n\tbyte Java.Interop.NativeMethods:java_interop_jnienv_is_same_object (intptr,intptr,intptr)\n\tbyte* System.Text.Unicode.Utf8Utility:GetPointerToFirstInvalidByte (byte*,int,int&,int&)\n\tchar* Java.Interop.JniEnvironment/Strings:GetStringChars (Java.Interop.JniObjectReference,bool*)\n\tchar* Java.Interop.NativeMethods:java_interop_jnienv_get_string_chars (intptr,intptr,bool*)\n\tdouble System.BitConverter:UInt64BitsToDouble (ulong)\n\tdouble System.Math:Round (double)\n\tint Android.Graphics.Color:FromArgb (int,int,int,int)\n\tint Android.Runtime.AndroidObjectReferenceManager:_monodroid_gref_get ()\n\tint Android.Runtime.AndroidObjectReferenceManager:get_GlobalReferenceCount ()\n\tint Android.Runtime.AndroidTypeManager:CountMethods (System.ReadOnlySpan`1<char>)\n\tint Android.Runtime.IdentityHashTargets:get_Count ()\n\tint Android.Runtime.JNIEnv:_GetArrayLength (intptr)\n\tint Android.Runtime.JNIEnv:_monodroid_gref_log_new (intptr,byte,intptr,byte,string,int,System.Text.StringBuilder,int)\n\tint Java.Interop.JniEnvironment/Arrays:GetArrayLength (Java.Interop.JniObjectReference)\n\tint Java.Interop.JniEnvironment/References:GetJavaVM (intptr,intptr&)\n\tint Java.Interop.JniEnvironment/Strings:GetStringLength (Java.Interop.JniObjectReference)\n\tint Java.Interop.JniEnvironment/Types:_RegisterNatives (Java.Interop.JniObjectReference,Java.Interop.JniNativeMethodRegistration[],int)\n\tint Java.Interop.JniPeerMembers:GetSignatureSeparatorIndex (string)\n\tint Java.Interop.NativeMethods:java_interop_jnienv_get_array_length (intptr,intptr)\n\tint Java.Interop.NativeMethods:java_interop_jnienv_get_java_vm (intptr,intptr&)\n\tint Java.Interop.NativeMethods:java_interop_jnienv_get_string_length (intptr,intptr)\n\tint Java.Interop.NativeMethods:java_interop_jnienv_register_natives (intptr,intptr&,intptr,Java.Interop.JniNativeMethodRegistration[],int)\n\tint System.Array:GetLowerBound (int)\n\tint System.Collections.Generic.Dictionary`2<System.Int32, System.Boolean>:Initialize (int)\n\tint System.Collections.Generic.Dictionary`2<System.IntPtr, Android.Runtime.IdentityHashTargets>:Initialize (int)\n\tint System.Collections.Generic.Dictionary`2<System.IntPtr, Java.Interop.JniRuntime>:Initialize (int)\n\tint System.Collections.Generic.Dictionary`2<System.IntPtr, System.IDisposable>:Initialize (int)\n\tint System.Collections.Generic.Dictionary`2<System.String, System.IntPtr>:Initialize (int)\n\tint System.Collections.Generic.Dictionary`2<System.String, System.Object>:Initialize (int)\n\tint System.Collections.Generic.List`1<Spice.View>:get_Count ()\n\tint System.Collections.Generic.List`1<System.Int32>:EnsureCapacity (int)\n\tint System.Collections.Generic.NonRandomizedStringEqualityComparer/OrdinalComparer:GetHashCode (string)\n\tint System.Collections.HashHelpers:ExpandPrime (int)\n\tint System.Collections.HashHelpers:GetPrime (int)\n\tint System.Environment:GetProcessorCount ()\n\tint System.Globalization.GlobalizationMode:LoadICU ()\n\tint System.Globalization.Ordinal:CompareStringIgnoreCase (char&,int,char&,int)\n\tint System.Globalization.Ordinal:IndexOf (string,string,int,int,bool)\n\tint System.Math:Min (int,int)\n\tint System.Private.CoreLib.Interop/Globalization:LoadICU ()\n\tint System.Reflection.MonoMethodInfo:get_method_attributes (intptr)\n\tint System.SpanHelpers:IndexOf (char&,int,char&,int)\n\tint System.SpanHelpers:IndexOfChar (char&,char,int)\n\tint System.SpanHelpers:IndexOfNullByte (byte&)\n\tint System.SpanHelpers:IndexOfNullCharacter (char&)\n\tint System.String:Compare (string,string,System.StringComparison)\n\tint System.String:GetNonRandomizedHashCode ()\n\tint System.String:IndexOf (char)\n\tint System.String:IndexOf (string,int,int,System.StringComparison)\n\tint System.String:IndexOf (string,System.StringComparison)\n\tint System.String:strlen (byte*)\n\tint System.String:wcslen (char*)\n\tint System.Text.UTF8Encoding:GetBytes (System.ReadOnlySpan`1<char>,System.Span`1<byte>)\n\tint System.Text.UTF8Encoding:GetBytesFast (char*,int,byte*,int,int&)\n\tint System.Text.UTF8Encoding:GetCharCount (byte*,int)\n\tint System.Text.UTF8Encoding:GetCharCountFast (byte*,int,System.Text.DecoderFallback,int&)\n\tint System.Text.UTF8Encoding:GetChars (byte*,int,char*,int)\n\tint System.Text.UTF8Encoding:GetCharsFast (byte*,int,char*,int,int&)\n\tint System.Threading.ThreadLocal`1/IdManager<Java.Interop.JniEnvironmentInfo>:GetId (bool)\n\tint System.Threading.ThreadLocal`1<Java.Interop.JniEnvironmentInfo>:GetNewTableSize (int)\n\tInterop/Globalization/ResultCode System.Private.CoreLib.Interop/Globalization:<GetSortHandle>g____PInvoke|10_0 (byte*,intptr*)\n\tInterop/Globalization/ResultCode System.Private.CoreLib.Interop/Globalization:GetSortHandle (string,intptr&)\n\tintptr Android.Runtime.CharSequence:ToLocalJniHandle (Java.Lang.ICharSequence)\n\tintptr Android.Runtime.JNIEnv:_monodroid_get_identity_hash_code (intptr,intptr)\n\tintptr Android.Runtime.JNIEnv:AllocObject (intptr)\n\tintptr Android.Runtime.JNIEnv:AllocObject (string)\n\tintptr Android.Runtime.JNIEnv:BinaryName (string)\n\tintptr Android.Runtime.JNIEnv:FindClass (string)\n\tintptr Android.Runtime.JNIEnv:get_Handle ()\n\tintptr Android.Runtime.JNIEnv:GetMethodID (intptr,string,string)\n\tintptr Android.Runtime.JNIEnv:GetObjectClass (intptr)\n\tintptr Android.Runtime.JNIEnv:monodroid_typemap_managed_to_java (System.Type,byte*)\n\tintptr Android.Runtime.JNIEnv:NewGlobalRef (intptr)\n\tintptr Android.Runtime.JNIEnv:NewLocalRef (intptr)\n\tintptr Android.Runtime.JNIEnv:NewString (char[],int)\n\tintptr Android.Runtime.JNIEnv:NewString (string)\n\tintptr Android.Runtime.JNIEnv:StartCreateInstance (string,string,Android.Runtime.JValue[])\n\tintptr Android.Runtime.JNIEnv:StartCreateInstance (string,string,Android.Runtime.JValue*)\n\tintptr Android.Runtime.JNIEnv:ToLocalJniHandle (Android.Runtime.IJavaObject)\n\tintptr Android.Runtime.JNIEnv/<>c:<Initialize>b__29_0 (intptr)\n\tintptr Java.Interop.JniRuntime:get_InvocationPointer ()\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_alloc_object (intptr,intptr&,intptr)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_call_static_object_method_a (intptr,intptr&,intptr,intptr,intptr)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_find_class (intptr,intptr&,string)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_get_method_id (intptr,intptr&,intptr,string,string)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_get_object_class (intptr,intptr)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_get_static_method_id (intptr,intptr&,intptr,string,string)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_new_global_ref (intptr,intptr)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_new_local_ref (intptr,intptr)\n\tintptr Java.Interop.NativeMethods:java_interop_jnienv_new_string (intptr,intptr&,char*,int)\n\tintptr Java.Interop.TypeManager:monodroid_TypeManager_get_java_class_name (intptr)\n\tintptr Java.Lang.Object:get_Handle ()\n\tintptr Java.Lang.Object:Java.Interop.IJavaObjectEx.ToLocalJniHandle ()\n\tintptr Mono.RuntimeGPtrArrayHandle:get_Item (int)\n\tintptr Mono.RuntimeGPtrArrayHandle:Lookup (int)\n\tintptr Mono.SafeGPtrArrayHandle:get_Item (int)\n\tintptr Mono.SafeStringMarshal:get_Value ()\n\tintptr Mono.SafeStringMarshal:StringToUtf8 (string)\n\tintptr Mono.SafeStringMarshal:StringToUtf8_icall (string&)\n\tintptr System.Globalization.CompareInfo/SortHandleCache:GetCachedSortHandle (string)\n\tintptr System.Private.CoreLib.Interop/Sys:<GetEnv>g____PInvoke|0_0 (byte*)\n\tintptr System.Private.CoreLib.Interop/Sys:GetEnv (string)\n\tintptr System.Runtime.InteropServices.GCHandle:InternalAlloc (object,System.Runtime.InteropServices.GCHandleType)\n\tintptr System.Runtime.InteropServices.Marshal:ReadIntPtr (intptr,int)\n\tintptr System.Runtime.InteropServices.Marshal:ReadIntPtr (intptr)\n\tintptr System.RuntimeType:GetConstructors_native (System.Runtime.CompilerServices.QCallTypeHandle,System.Reflection.BindingFlags)\n\tintptr System.RuntimeType:GetMethodsByName_native (System.Runtime.CompilerServices.QCallTypeHandle,intptr,System.Reflection.BindingFlags,System.RuntimeType/MemberListType)\n\tintptr& System.Collections.Generic.Dictionary`2<System.String, System.IntPtr>:FindValue (string)\n\tJava.Interop.IJavaPeerable Android.Runtime.AndroidValueManager:PeekPeer (Java.Interop.JniObjectReference)\n\tJava.Interop.IJavaPeerable Java.Lang.Object:GetObject (intptr,Android.Runtime.JniHandleOwnership,System.Type)\n\tJava.Interop.IJavaPeerable Java.Lang.Object:PeekObject (intptr,System.Type)\n\tJava.Interop.IJavaPeerable System.WeakReference`1<Java.Interop.IJavaPeerable>:get_Target ()\n\tJava.Interop.JavaVMInterface Java.Interop.JniRuntime:CreateInvoker (intptr)\n\tJava.Interop.JniEnvironmentInfo System.Threading.ThreadLocal`1<Java.Interop.JniEnvironmentInfo>:get_Value ()\n\tJava.Interop.JniMethodInfo Java.Interop.JniEnvironment/InstanceMethods:GetMethodID (Java.Interop.JniObjectReference,string,string)\n\tJava.Interop.JniMethodInfo Java.Interop.JniPeerMembers/JniInstanceMethods:GetConstructor (string)\n\tJava.Interop.JniMethodInfo Java.Interop.JniPeerMembers/JniInstanceMethods:GetMethodInfo (string,string)\n\tJava.Interop.JniMethodInfo Java.Interop.JniPeerMembers/JniInstanceMethods:GetMethodInfo (string)\n\tJava.Interop.JniMethodInfo Java.Interop.JniPeerMembers/JniStaticMethods:GetMethodInfo (string,string)\n\tJava.Interop.JniMethodInfo Java.Interop.JniPeerMembers/JniStaticMethods:GetMethodInfo (string)\n\tJava.Interop.JniMethodInfo Java.Interop.JniType:GetConstructor (string)\n\tJava.Interop.JniMethodInfo Java.Interop.JniType:GetInstanceMethod (string,string)\n\tJava.Interop.JniObjectReference Android.Runtime.AndroidObjectReferenceManager:CreateGlobalReference (Java.Interop.JniObjectReference)\n\tJava.Interop.JniObjectReference Android.Runtime.AndroidObjectReferenceManager:CreateLocalReference (Java.Interop.JniObjectReference,int&)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/Object:AllocObject (Java.Interop.JniObjectReference)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/References:NewGlobalRef (Java.Interop.JniObjectReference)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/References:NewLocalRef (Java.Interop.JniObjectReference)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/StaticMethods:CallStaticObjectMethod (Java.Interop.JniObjectReference,Java.Interop.JniMethodInfo,Java.Interop.JniArgumentValue*)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/Strings:NewString (char*,int)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/Strings:NewString (string)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/Types:FindClass (string)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/Types:GetObjectClass (Java.Interop.JniObjectReference)\n\tJava.Interop.JniObjectReference Java.Interop.JniEnvironment/Types:TryFindClass (string,bool)\n\tJava.Interop.JniObjectReference Java.Interop.JniObjectReference:NewGlobalRef ()\n\tJava.Interop.JniObjectReference Java.Interop.JniObjectReference:NewLocalRef ()\n\tJava.Interop.JniObjectReference Java.Interop.JniPeerMembers/JniInstanceMethods:StartCreateInstance (string,System.Type,Java.Interop.JniArgumentValue*)\n\tJava.Interop.JniObjectReference Java.Interop.JniRuntime/JniObjectReferenceManager:CreateGlobalReference (Java.Interop.JniObjectReference)\n\tJava.Interop.JniObjectReference Java.Interop.JniRuntime/JniObjectReferenceManager:CreateLocalReference (Java.Interop.JniEnvironmentInfo,Java.Interop.JniObjectReference)\n\tJava.Interop.JniObjectReference Java.Interop.JniRuntime/JniObjectReferenceManager:CreateLocalReference (Java.Interop.JniObjectReference,int&)\n\tJava.Interop.JniObjectReference Java.Interop.JniType:AllocObject ()\n\tJava.Interop.JniObjectReference Java.Lang.Object:get_PeerReference ()\n\tJava.Interop.JniPeerMembers Android.Runtime.XAPeerMembers:GetPeerMembers (Java.Interop.IJavaPeerable)\n\tJava.Interop.JniPeerMembers AndroidX.AppCompat.App.AppCompatActivity:get_JniPeerMembers ()\n\tJava.Interop.JniPeerMembers Java.Interop.JniPeerMembers:GetPeerMembers (Java.Interop.IJavaPeerable)\n\tJava.Interop.JniPeerMembers Java.Lang.Class:get_Members ()\n\tJava.Interop.JniPeerMembers/JniInstanceMethods Java.Interop.JniPeerMembers:Assert (Java.Interop.JniPeerMembers/JniInstanceMethods)\n\tJava.Interop.JniPeerMembers/JniInstanceMethods Java.Interop.JniPeerMembers:get_InstanceMethods ()\n\tJava.Interop.JniPeerMembers/JniInstanceMethods Java.Interop.JniPeerMembers/JniInstanceMethods:GetConstructorsForType (System.Type)\n\tJava.Interop.JniPeerMembers/JniStaticMethods Java.Interop.JniPeerMembers:get_StaticMethods ()\n\tJava.Interop.JniRuntime Java.Interop.JniRuntime:GetRegisteredRuntime (intptr)\n\tJava.Interop.JniRuntime/JniValueManager Java.Interop.JniRuntime:get_ValueManager ()\n\tJava.Interop.JniRuntime/JniValueManager Java.Interop.JniRuntime:SetRuntime (Java.Interop.JniRuntime/JniValueManager)\n\tJava.Interop.JniRuntime& System.Collections.Generic.Dictionary`2<System.IntPtr, Java.Interop.JniRuntime>:FindValue (intptr)\n\tJava.Interop.JniType Java.Interop.JniPeerMembers:get_JniPeerType ()\n\tJava.Interop.JniType Java.Interop.JniPeerMembers/JniInstanceMethods:get_JniPeerType ()\n\tJava.Interop.JniType Java.Interop.JniType:GetCachedJniType (Java.Interop.JniType&,string)\n\tlong System.Runtime.InteropServices.Marshal:ReadInt64 (intptr,int)\n\tMicrosoft.Maui.Graphics.Color Microsoft.Maui.Graphics.Color:FromRgba (byte,byte,byte,byte)\n\tMicrosoft.Maui.Graphics.Color Microsoft.Maui.Graphics.Color:FromUint (uint)\n\tobject System.Activator:CreateInstance (System.Type,bool,bool)\n\tobject System.Activator:CreateInstance (System.Type,bool)\n\tobject System.AppContext:GetData (string)\n\tobject System.Collections.Specialized.SingleItemReadOnlyList/<GetEnumerator>d__15:System.Collections.IEnumerator.get_Current ()\n\tobject System.Delegate:get_Target ()\n\tobject System.GC:get_ephemeron_tombstone ()\n\tobject System.MulticastDelegate:GetTarget ()\n\tobject System.Reflection.ConstructorInvoker:InterpretedInvoke (object,System.Span`1<object>,System.Reflection.BindingFlags)\n\tobject System.Reflection.MethodBase:Invoke (object,object[])\n\tobject System.Reflection.RuntimeConstructorInfo:InternalInvoke (object,System.Span`1<object>&,System.Exception&)\n\tobject System.Reflection.RuntimeConstructorInfo:Invoke (object,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo)\n\tobject System.Runtime.CompilerServices.RuntimeHelpers:GetUninitializedObject (System.Type)\n\tobject System.Runtime.CompilerServices.RuntimeHelpers:GetUninitializedObjectInternal (intptr)\n\tobject System.Runtime.InteropServices.GCHandle:get_Target ()\n\tobject System.Runtime.InteropServices.GCHandle:InternalGet (intptr)\n\tobject System.Runtime.InteropServices.Marshal:PtrToStructure (intptr,System.Type)\n\tobject System.RuntimeType:CreateInstanceDefaultCtor (bool,bool)\n\tobject System.RuntimeType:CreateInstanceForAnotherGenericParameter (System.Type,System.RuntimeType,System.RuntimeType)\n\tobject System.RuntimeType:CreateInstanceInternal (System.Runtime.CompilerServices.QCallTypeHandle)\n\tobject System.RuntimeType:CreateInstanceMono (bool,bool)\n\tobject[] Android.Runtime.JNIEnv:GetObjectArray (intptr,System.Type[])\n\tstring Android.Runtime.AndroidTypeManager:GetReplacementTypeCore (string)\n\tstring Android.Runtime.JNIEnv:GetJniName (System.Type)\n\tstring Android.Runtime.JNIEnv:GetString (intptr,Android.Runtime.JniHandleOwnership)\n\tstring Android.Runtime.JNIEnv:TypemapManagedToJava (System.Type)\n\tstring Java.Interop.JniEnvironment/Strings:ToString (Java.Interop.JniObjectReference)\n\tstring Java.Interop.JniEnvironment/Strings:ToString (Java.Interop.JniObjectReference&,Java.Interop.JniObjectReferenceOptions)\n\tstring Java.Interop.JniPeerMembers:GetReplacementType (string)\n\tstring Java.Interop.JniRuntime/JniTypeManager:GetReplacementType (string)\n\tstring Java.Interop.TypeManager:GetClassName (intptr)\n\tstring System.Environment:GetEnvironmentVariable (string)\n\tstring System.Environment:GetEnvironmentVariableCore (string)\n\tstring System.Globalization.CultureData:get_CultureName ()\n\tstring System.Globalization.CultureInfo:get_SortName ()\n\tstring System.ReadOnlySpan`1<System.Char>:ToString ()\n\tstring System.Runtime.InteropServices.Marshal:PtrToStringUTF8 (intptr)\n\tstring System.RuntimeType:get_Name ()\n\tstring System.String:CreateStringForSByteConstructor (byte*,int)\n\tstring System.String:CreateStringFromEncoding (byte*,int,System.Text.Encoding)\n\tstring System.String:Ctor (char*,int,int)\n\tstring System.String:Ctor (char*)\n\tstring System.String:Ctor (sbyte*)\n\tstring System.String:Ctor (System.ReadOnlySpan`1<char>)\n\tstring System.String:InternalSubString (int,int)\n\tstring System.String:Substring (int,int)\n\tstring System.String:Substring (int)\n\tSystem.Buffers.OperationStatus System.Text.Unicode.Utf8Utility:TranscodeToUtf16 (byte*,int,char*,int,byte*&,char*&)\n\tSystem.Buffers.OperationStatus System.Text.Unicode.Utf8Utility:TranscodeToUtf8 (char*,int,byte*,int,char*&,byte*&)\n\tSystem.Collections.Generic.Dictionary`2<string, System.Type> Java.Interop.TypeManagerMapDictionaries:get_JniToManaged ()\n\tSystem.Collections.Generic.EqualityComparer`1<intptr> System.Collections.Generic.EqualityComparer`1<System.IntPtr>:CreateComparer ()\n\tSystem.Collections.Generic.EqualityComparer`1<string> System.Collections.Generic.EqualityComparer`1<System.String>:CreateComparer ()\n\tSystem.Collections.Generic.IEqualityComparer`1<string> System.Collections.Generic.NonRandomizedStringEqualityComparer:GetStringComparer (object)\n\tSystem.Collections.IEnumerator System.Collections.Specialized.SingleItemReadOnlyList:GetEnumerator ()\n\tSystem.Delegate Android.App.Activity:GetOnCreate_Landroid_os_Bundle_Handler ()\n\tSystem.Delegate Android.Runtime.JNINativeWrapper:CreateBuiltInDelegate (System.Delegate,System.Type)\n\tSystem.Delegate Android.Runtime.JNINativeWrapper:CreateDelegate (System.Delegate)\n\tSystem.Delegate Android.Views.View/IOnClickListenerInvoker:GetOnClick_Landroid_view_View_Handler ()\n\tSystem.Delegate Java.Interop.TypeManager:GetActivateHandler ()\n\tSystem.Delegate Java.Interop.TypeManager/JavaTypeManager:GetActivateHandler ()\n\tSystem.Delegate System.Delegate:Combine (System.Delegate,System.Delegate)\n\tSystem.Delegate System.Delegate:CreateDelegate (System.Type,System.Type,string,bool,bool)\n\tSystem.Delegate System.Delegate:CreateDelegate (System.Type,System.Type,string)\n\tSystem.Delegate System.Delegate:CreateDelegate_internal (System.Runtime.CompilerServices.QCallTypeHandle,object,System.Reflection.MethodInfo,bool)\n\tSystem.Exception Java.Interop.JniEnvironment:GetExceptionForLastThrowable (intptr)\n\tSystem.Globalization.CalendarData System.Globalization.CalendarData:CreateInvariant ()\n\tSystem.Globalization.CompareInfo System.Globalization.CultureInfo:get_CompareInfo ()\n\tSystem.Globalization.CultureData System.Globalization.CultureData:CreateCultureWithInvariantData ()\n\tSystem.Globalization.CultureData System.Globalization.CultureData:get_Invariant ()\n\tSystem.Globalization.CultureInfo System.Globalization.CultureInfo:get_InvariantCulture ()\n\tSystem.Guid System.Reflection.RuntimeModule:get_ModuleVersionId ()\n\tSystem.Guid System.Reflection.RuntimeModule:GetModuleVersionId ()\n\tSystem.IDisposable& System.Collections.Generic.Dictionary`2<System.IntPtr, System.IDisposable>:FindValue (intptr)\n\tSystem.LazyHelper System.LazyHelper:Create (System.Threading.LazyThreadSafetyMode,bool)\n\tSystem.Nullable`1<Java.Interop.JniRuntime/ReplacementMethodInfo> Android.Runtime.AndroidTypeManager:GetReplacementMethodInfoCore (string,string,string)\n\tSystem.Nullable`1<Java.Interop.JniRuntime/ReplacementMethodInfo> Java.Interop.JniRuntime/JniTypeManager:GetReplacementMethodInfo (string,string,string)\n\tSystem.Reflection.CallingConventions System.Reflection.MonoMethodInfo:GetCallingConvention (intptr)\n\tSystem.Reflection.CallingConventions System.Reflection.RuntimeConstructorInfo:get_CallingConvention ()\n\tSystem.Reflection.ConstructorInfo System.RuntimeType:GetConstructorImpl (System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[])\n\tSystem.Reflection.ConstructorInfo System.RuntimeType/ListBuilder`1<System.Reflection.ConstructorInfo>:get_Item (int)\n\tSystem.Reflection.ConstructorInfo System.Type:GetConstructor (System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[])\n\tSystem.Reflection.ConstructorInfo System.Type:GetConstructor (System.Reflection.BindingFlags,System.Reflection.Binder,System.Type[],System.Reflection.ParameterModifier[])\n\tSystem.Reflection.ConstructorInfo System.Type:GetConstructor (System.Type[])\n\tSystem.Reflection.CorElementType System.RuntimeTypeHandle:GetCorElementType (System.Runtime.CompilerServices.QCallTypeHandle)\n\tSystem.Reflection.CorElementType System.RuntimeTypeHandle:GetCorElementType (System.RuntimeType)\n\tSystem.Reflection.InvocationFlags System.Reflection.RuntimeConstructorInfo:ComputeAndUpdateInvocationFlags (System.Reflection.ConstructorInfo,System.Reflection.InvocationFlags&)\n\tSystem.Reflection.MethodAttributes System.Reflection.MonoMethodInfo:GetAttributes (intptr)\n\tSystem.Reflection.MethodAttributes System.Reflection.RuntimeConstructorInfo:get_Attributes ()\n\tSystem.Reflection.MethodBase System.Reflection.RuntimeMethodInfo:GetMethodFromHandleInternalType_native (intptr,intptr,bool)\n\tSystem.Reflection.MethodBase System.Reflection.RuntimeMethodInfo:GetMethodFromHandleNoGenericCheck (System.RuntimeMethodHandle,System.RuntimeTypeHandle)\n\tSystem.Reflection.MethodBase System.Reflection.RuntimeMethodInfo:GetMethodFromHandleNoGenericCheck (System.RuntimeMethodHandle)\n\tSystem.Reflection.MethodInfo System.Delegate:get_Method ()\n\tSystem.Reflection.MethodInfo System.Delegate:GetCandidateMethod (System.RuntimeType,System.Type,string,System.Reflection.BindingFlags,bool)\n\tSystem.Reflection.MethodInfo System.Delegate:GetDelegateInvokeMethod (System.RuntimeType)\n\tSystem.Reflection.MethodInfo System.Delegate:GetMethodImpl ()\n\tSystem.Reflection.MethodInfo System.MulticastDelegate:GetMethodImpl ()\n\tSystem.Reflection.MethodInfo System.RuntimeType:GetMethodImpl (string,int,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[])\n\tSystem.Reflection.MethodInfo System.RuntimeType:GetMethodImpl (string,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[])\n\tSystem.Reflection.MethodInfo System.Type:GetMethod (string,System.Reflection.BindingFlags,System.Reflection.Binder,System.Reflection.CallingConventions,System.Type[],System.Reflection.ParameterModifier[])\n\tSystem.Reflection.MethodInfo System.Type:GetMethod (string,System.Reflection.BindingFlags,System.Reflection.Binder,System.Type[],System.Reflection.ParameterModifier[])\n\tSystem.Reflection.MethodInfo System.Type:GetMethod (string,System.Reflection.BindingFlags)\n\tSystem.Reflection.MethodInfo System.Type:GetMethod (string)\n\tSystem.Reflection.Module System.RuntimeType:get_Module ()\n\tSystem.Reflection.MonoMethodInfo System.Reflection.MonoMethodInfo:GetMethodInfo (intptr)\n\tSystem.Reflection.ParameterInfo[] System.Reflection.MethodBase:GetParametersNoCopy ()\n\tSystem.Reflection.ParameterInfo[] System.Reflection.MonoMethodInfo:get_parameter_info (intptr,System.Reflection.MemberInfo)\n\tSystem.Reflection.ParameterInfo[] System.Reflection.MonoMethodInfo:GetParametersInfo (intptr,System.Reflection.MemberInfo)\n\tSystem.Reflection.ParameterInfo[] System.Reflection.RuntimeConstructorInfo:GetParametersInternal ()\n\tSystem.Reflection.ParameterInfo[] System.Reflection.RuntimeMethodInfo:GetParametersInternal ()\n\tSystem.Reflection.RuntimeConstructorInfo System.RuntimeType:GetDefaultConstructor ()\n\tSystem.Reflection.RuntimeConstructorInfo[] System.RuntimeType:GetConstructors_internal (System.Reflection.BindingFlags,System.RuntimeType)\n\tSystem.Reflection.RuntimeMethodInfo[] System.RuntimeType:GetMethodsByName (string,System.Reflection.BindingFlags,System.RuntimeType/MemberListType,System.RuntimeType)\n\tSystem.Reflection.RuntimeModule System.RuntimeType:GetRuntimeModule ()\n\tSystem.Reflection.RuntimeModule System.RuntimeTypeHandle:GetModule (System.RuntimeType)\n\tSystem.Reflection.TypeAttributes System.RuntimeType:GetAttributeFlagsImpl ()\n\tSystem.Reflection.TypeAttributes System.RuntimeTypeHandle:GetAttributes (System.Runtime.CompilerServices.QCallTypeHandle)\n\tSystem.Reflection.TypeAttributes System.RuntimeTypeHandle:GetAttributes (System.RuntimeType)\n\tSystem.Reflection.TypeAttributes System.Type:get_Attributes ()\n\tSystem.Runtime.InteropServices.GCHandle System.Runtime.InteropServices.GCHandle:Alloc (object,System.Runtime.InteropServices.GCHandleType)\n\tSystem.RuntimeType System.RuntimeType:GetBaseType ()\n\tSystem.RuntimeType System.RuntimeType:GetType (string,bool,bool,System.Threading.StackCrawlMark&)\n\tSystem.RuntimeType System.RuntimeTypeHandle:GetBaseType (System.RuntimeType)\n\tSystem.RuntimeType System.RuntimeTypeHandle:GetTypeByName (string,bool,bool,System.Threading.StackCrawlMark&)\n\tSystem.RuntimeType[] System.Reflection.RuntimeConstructorInfo:get_ArgumentTypes ()\n\tSystem.RuntimeType/ListBuilder`1<System.Reflection.ConstructorInfo> System.RuntimeType:GetConstructorCandidates (string,System.Reflection.BindingFlags,System.Reflection.CallingConventions,System.Type[],bool)\n\tSystem.RuntimeType/ListBuilder`1<System.Reflection.MethodInfo> System.RuntimeType:GetMethodCandidates (string,System.Reflection.BindingFlags,System.Reflection.CallingConventions,System.Type[],int,bool)\n\tSystem.RuntimeType/TypeCache System.RuntimeType:get_Cache ()\n\tSystem.Text.Encoding System.Text.Encoding:get_UTF8 ()\n\tSystem.Threading.SynchronizationContext Android.App.Application:get_SynchronizationContext ()\n\tSystem.Threading.Thread System.Threading.Thread:get_CurrentThread ()\n\tSystem.Threading.Thread System.Threading.Thread:GetCurrentThread ()\n\tSystem.Threading.Thread System.Threading.Thread:InitializeCurrentThread ()\n\tSystem.Type Android.Runtime.XAPeerMembers:GetThresholdType (Java.Interop.IJavaPeerable)\n\tSystem.Type Android.Widget.Button:get_ThresholdType ()\n\tSystem.Type Android.Widget.ImageView:get_ThresholdType ()\n\tSystem.Type Android.Widget.LinearLayout:get_ThresholdType ()\n\tSystem.Type Android.Widget.RelativeLayout:get_ThresholdType ()\n\tSystem.Type Android.Widget.RelativeLayout/LayoutParams:get_ThresholdType ()\n\tSystem.Type Android.Widget.TextView:get_ThresholdType ()\n\tSystem.Type AndroidX.AppCompat.App.AppCompatActivity:get_ThresholdType ()\n\tSystem.Type Java.Lang.Object:GetThresholdType ()\n\tSystem.Type System.Reflection.MonoMethodInfo:GetDeclaringType (intptr)\n\tSystem.Type System.Reflection.MonoMethodInfo:GetReturnType (intptr)\n\tSystem.Type System.Reflection.RuntimeConstructorInfo:get_DeclaringType ()\n\tSystem.Type System.Reflection.RuntimeMethodInfo:get_ReturnType ()\n\tSystem.Type System.RuntimeType:get_BaseType ()\n\tSystem.Type System.RuntimeType:get_UnderlyingSystemType ()\n\tSystem.Type System.RuntimeType:GetGenericTypeDefinition ()\n\tSystem.Type System.RuntimeType:MakeByRefType ()\n\tSystem.Type System.RuntimeTypeHandle:GetGenericTypeDefinition (System.RuntimeType)\n\tSystem.Type System.Type:GetRootElementType ()\n\tSystem.Type System.Type:GetType (string,bool)\n\tSystem.Type System.Type:GetType (string)\n\tSystem.Type[] Java.Interop.TypeManager:GetParameterTypes (string)\n\tSystem.Type& System.Collections.Generic.Dictionary`2<System.String, System.Type>:FindValue (string)\n\tSystem.WeakReference`1<Java.Interop.IJavaPeerable> Android.Runtime.IdentityHashTargets:CreateWeakReference (Java.Interop.IJavaPeerable)\n\tSystem.WeakReference`1<Java.Interop.IJavaPeerable> Android.Runtime.IdentityHashTargets:get_Item (int)\n\tuint Android.Runtime.Logger:monodroid_get_log_categories ()\n\tuint Mono.Android.<PrivateImplementationDetails>:ComputeStringHash (string)\n\tuintptr System.Text.ASCIIUtility:GetIndexOfFirstNonAsciiByte_Default (byte*,uintptr)\n\tuintptr System.Text.ASCIIUtility:NarrowUtf16ToAscii (char*,byte*,uintptr)\n\tuintptr System.Text.ASCIIUtility:WidenAsciiToUtf16 (byte*,char*,uintptr)\n\tulong System.BitConverter:DoubleToUInt64Bits (double)\n\tulong System.Collections.HashHelpers:GetFastModMultiplier (uint)\n\tvoid Android.App.Activity:.cctor ()\n\tvoid Android.App.Activity:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.App.Activity:n_OnCreate_Landroid_os_Bundle_ (intptr,intptr,intptr)\n\tvoid Android.App.Activity:OnCreate (Android.OS.Bundle)\n\tvoid Android.App.Activity:SetContentView (Android.Views.View)\n\tvoid Android.App.Application:.cctor ()\n\tvoid Android.Content.Context:.cctor ()\n\tvoid Android.Content.Context:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Content.ContextWrapper:.cctor ()\n\tvoid Android.Content.ContextWrapper:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Graphics.Color:.ctor (int,int,int,int)\n\tvoid Android.Graphics.Color:CheckARGBValues (int,int,int,int)\n\tvoid Android.Graphics.Color:CheckRGBValues (int,int,int)\n\tvoid Android.Runtime.AndroidObjectReferenceManager:CreatedLocalReference (Java.Interop.JniObjectReference,int&)\n\tvoid Android.Runtime.AndroidObjectReferenceManager:DeleteGlobalReference (Java.Interop.JniObjectReference&)\n\tvoid Android.Runtime.AndroidObjectReferenceManager:DeleteLocalReference (Java.Interop.JniObjectReference&,int&)\n\tvoid Android.Runtime.AndroidRuntime:.ctor (intptr,intptr,bool,intptr,intptr,bool)\n\tvoid Android.Runtime.AndroidRuntimeOptions:.ctor (intptr,intptr,bool,intptr,intptr,bool)\n\tvoid Android.Runtime.AndroidTypeManager:.cctor ()\n\tvoid Android.Runtime.AndroidTypeManager:.ctor (bool)\n\tvoid Android.Runtime.AndroidTypeManager:RegisterNativeMembers (Java.Interop.JniType,System.Type,System.ReadOnlySpan`1<char>)\n\tvoid Android.Runtime.AndroidTypeManager:SplitMethodLine (System.ReadOnlySpan`1<char>,System.ReadOnlySpan`1<char>&,System.ReadOnlySpan`1<char>&,System.ReadOnlySpan`1<char>&,System.ReadOnlySpan`1<char>&)\n\tvoid Android.Runtime.AndroidTypeManager/MagicRegistrationMap:.cctor ()\n\tvoid Android.Runtime.AndroidTypeManager/MagicRegistrationMap:Prefill ()\n\tvoid Android.Runtime.AndroidValueManager:.ctor ()\n\tvoid Android.Runtime.AndroidValueManager:AddPeer (Java.Interop.IJavaPeerable,intptr,Android.Runtime.JniHandleOwnership,intptr&)\n\tvoid Android.Runtime.AndroidValueManager:AddPeer (Java.Interop.IJavaPeerable,Java.Interop.JniObjectReference,intptr)\n\tvoid Android.Runtime.AndroidValueManager:RemovePeer (Java.Interop.IJavaPeerable,intptr)\n\tvoid Android.Runtime.AndroidValueManager:RemovePeer (Java.Interop.IJavaPeerable)\n\tvoid Android.Runtime.IdentityHashTargets:.ctor (Java.Interop.IJavaPeerable)\n\tvoid Android.Runtime.IdentityHashTargets:RemoveAt (int)\n\tvoid Android.Runtime.JNIEnv:_monodroid_gref_log_delete (intptr,byte,string,int,System.Text.StringBuilder,int)\n\tvoid Android.Runtime.JNIEnv:.cctor ()\n\tvoid Android.Runtime.JNIEnv:CallNonvirtualVoidMethod (intptr,intptr,intptr,Android.Runtime.JValue*)\n\tvoid Android.Runtime.JNIEnv:CheckHandle (intptr)\n\tvoid Android.Runtime.JNIEnv:DeleteGlobalRef (intptr)\n\tvoid Android.Runtime.JNIEnv:DeleteLocalRef (intptr)\n\tvoid Android.Runtime.JNIEnv:DeleteRef (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Runtime.JNIEnv:FinishCreateInstance (intptr,string,Android.Runtime.JValue[])\n\tvoid Android.Runtime.JNIEnv:FinishCreateInstance (intptr,string,Android.Runtime.JValue*)\n\tvoid Android.Runtime.JNIEnv:Initialize (Android.Runtime.JnienvInitializeArgs*)\n\tvoid Android.Runtime.JNIEnv:InvokeConstructor (intptr,string,Android.Runtime.JValue*)\n\tvoid Android.Runtime.JNIEnv:monodroid_free (intptr)\n\tvoid Android.Runtime.JNIEnv:RegisterJniNatives (intptr,int,intptr,intptr,int)\n\tvoid Android.Runtime.JNIEnv:SetSynchronizationContext ()\n\tvoid Android.Runtime.JNIEnv:WaitForBridgeProcessing ()\n\tvoid Android.Runtime.JNIEnv/<>c:.cctor ()\n\tvoid Android.Runtime.JNIEnv/<>c:.ctor ()\n\tvoid Android.Runtime.JNINativeWrapper:get_runtime_types ()\n\tvoid Android.Runtime.JNINativeWrapper:Wrap_JniMarshal_PPL_V (_JniMarshal_PPL_V,intptr,intptr,intptr)\n\tvoid Android.Runtime.JNINativeWrapper:Wrap_JniMarshal_PPLLLL_V (_JniMarshal_PPLLLL_V,intptr,intptr,intptr,intptr,intptr,intptr)\n\tvoid Android.Runtime.Logger:.cctor ()\n\tvoid Android.Runtime.XAPeerMembers:.cctor ()\n\tvoid Android.Runtime.XAPeerMembers:.ctor (string,System.Type)\n\tvoid Android.Views.ContextThemeWrapper:.cctor ()\n\tvoid Android.Views.ContextThemeWrapper:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Views.View:.cctor ()\n\tvoid Android.Views.View:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Views.View:add_Click (System.EventHandler)\n\tvoid Android.Views.View:set_LayoutParameters (Android.Views.ViewGroup/LayoutParams)\n\tvoid Android.Views.View:SetBackgroundColor (Android.Graphics.Color)\n\tvoid Android.Views.View:SetOnClickListener (Android.Views.View/IOnClickListener)\n\tvoid Android.Views.View/<>c__DisplayClass2912_0:<add_Click>b__0 (Android.Views.View/IOnClickListenerImplementor)\n\tvoid Android.Views.View/IOnClickListenerImplementor:.ctor ()\n\tvoid Android.Views.View/IOnClickListenerInvoker:.cctor ()\n\tvoid Android.Views.ViewGroup:.cctor ()\n\tvoid Android.Views.ViewGroup:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Views.ViewGroup:AddView (Android.Views.View)\n\tvoid Android.Views.ViewGroup/LayoutParams:.cctor ()\n\tvoid Android.Views.ViewGroup/LayoutParams:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Views.ViewGroup/MarginLayoutParams:.cctor ()\n\tvoid Android.Views.ViewGroup/MarginLayoutParams:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Widget.Button:.cctor ()\n\tvoid Android.Widget.Button:.ctor (Android.Content.Context)\n\tvoid Android.Widget.ImageView:.cctor ()\n\tvoid Android.Widget.ImageView:.ctor (Android.Content.Context)\n\tvoid Android.Widget.LinearLayout:.cctor ()\n\tvoid Android.Widget.LinearLayout:.ctor (Android.Content.Context)\n\tvoid Android.Widget.LinearLayout:set_Orientation (Android.Widget.Orientation)\n\tvoid Android.Widget.LinearLayout:SetGravity (Android.Views.GravityFlags)\n\tvoid Android.Widget.RelativeLayout:.cctor ()\n\tvoid Android.Widget.RelativeLayout:.ctor (Android.Content.Context)\n\tvoid Android.Widget.RelativeLayout/LayoutParams:.cctor ()\n\tvoid Android.Widget.RelativeLayout/LayoutParams:.ctor (int,int)\n\tvoid Android.Widget.RelativeLayout/LayoutParams:AddRule (Android.Widget.LayoutRules)\n\tvoid Android.Widget.TextView:.cctor ()\n\tvoid Android.Widget.TextView:.ctor (Android.Content.Context)\n\tvoid Android.Widget.TextView:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Android.Widget.TextView:set_Text (string)\n\tvoid Android.Widget.TextView:set_TextFormatted (Java.Lang.ICharSequence)\n\tvoid AndroidX.Activity.ComponentActivity:.cctor ()\n\tvoid AndroidX.Activity.ComponentActivity:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid AndroidX.AppCompat.App.AppCompatActivity:.cctor ()\n\tvoid AndroidX.AppCompat.App.AppCompatActivity:.ctor ()\n\tvoid AndroidX.Core.App.ComponentActivity:.cctor ()\n\tvoid AndroidX.Core.App.ComponentActivity:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid AndroidX.Fragment.App.FragmentActivity:.cctor ()\n\tvoid AndroidX.Fragment.App.FragmentActivity:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid CommunityToolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangedArgs:.cctor ()\n\tvoid CommunityToolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangingArgs:.cctor ()\n\tvoid CommunityToolkit.Mvvm.ComponentModel.ObservableObject:OnPropertyChanged (System.ComponentModel.PropertyChangedEventArgs)\n\tvoid CommunityToolkit.Mvvm.ComponentModel.ObservableObject:OnPropertyChanging (System.ComponentModel.PropertyChangingEventArgs)\n\tvoid Java.Interop.EventHelper:AddEventHandler (System.WeakReference&,System.Func`1<Android.Views.View/IOnClickListenerImplementor>,System.Action`1<Android.Views.View/IOnClickListener>,System.Action`1<Android.Views.View/IOnClickListenerImplementor>)\n\tvoid Java.Interop.JniEnvironment:.cctor ()\n\tvoid Java.Interop.JniEnvironment:LogCreateLocalRef (intptr)\n\tvoid Java.Interop.JniEnvironment:LogCreateLocalRef (Java.Interop.JniObjectReference)\n\tvoid Java.Interop.JniEnvironment:SetEnvironmentInfo (Java.Interop.JniEnvironmentInfo)\n\tvoid Java.Interop.JniEnvironment:SetEnvironmentPointer (intptr)\n\tvoid Java.Interop.JniEnvironment/<>c:.cctor ()\n\tvoid Java.Interop.JniEnvironment/<>c:.ctor ()\n\tvoid Java.Interop.JniEnvironment/InstanceMethods:CallNonvirtualVoidMethod (Java.Interop.JniObjectReference,Java.Interop.JniObjectReference,Java.Interop.JniMethodInfo,Java.Interop.JniArgumentValue*)\n\tvoid Java.Interop.JniEnvironment/InstanceMethods:CallVoidMethod (Java.Interop.JniObjectReference,Java.Interop.JniMethodInfo,Java.Interop.JniArgumentValue*)\n\tvoid Java.Interop.JniEnvironment/Object:.cctor ()\n\tvoid Java.Interop.JniEnvironment/References:DeleteGlobalRef (intptr)\n\tvoid Java.Interop.JniEnvironment/References:DeleteLocalRef (intptr)\n\tvoid Java.Interop.JniEnvironment/StaticMethods:CallStaticVoidMethod (Java.Interop.JniObjectReference,Java.Interop.JniMethodInfo,Java.Interop.JniArgumentValue*)\n\tvoid Java.Interop.JniEnvironment/Strings:ReleaseStringChars (Java.Interop.JniObjectReference,char*)\n\tvoid Java.Interop.JniEnvironment/Types:.cctor ()\n\tvoid Java.Interop.JniEnvironment/Types:RegisterNatives (Java.Interop.JniObjectReference,Java.Interop.JniNativeMethodRegistration[],int)\n\tvoid Java.Interop.JniEnvironmentInfo:.ctor (intptr,Java.Interop.JniRuntime)\n\tvoid Java.Interop.JniEnvironmentInfo:set_EnvironmentPointer (intptr)\n\tvoid Java.Interop.JniMethodInfo:.ctor (intptr,bool)\n\tvoid Java.Interop.JniMethodInfo:.ctor (string,string,intptr,bool)\n\tvoid Java.Interop.JniNativeMethodRegistration:.ctor (string,string,System.Delegate)\n\tvoid Java.Interop.JniObjectReference:Dispose (Java.Interop.JniObjectReference&,Java.Interop.JniObjectReferenceOptions)\n\tvoid Java.Interop.JniObjectReference:Dispose (Java.Interop.JniObjectReference&)\n\tvoid Java.Interop.JniObjectReference:set_Flags (Java.Interop.JniObjectReferenceFlags)\n\tvoid Java.Interop.JniPeerMembers:.ctor (string,System.Type,bool,bool)\n\tvoid Java.Interop.JniPeerMembers:.ctor (string,System.Type)\n\tvoid Java.Interop.JniPeerMembers:AssertSelf (Java.Interop.IJavaPeerable)\n\tvoid Java.Interop.JniPeerMembers:GetNameAndSignature (string,string&,string&)\n\tvoid Java.Interop.JniPeerMembers/JniInstanceFields:.ctor (Java.Interop.JniPeerMembers)\n\tvoid Java.Interop.JniPeerMembers/JniInstanceMethods:.ctor (Java.Interop.JniPeerMembers)\n\tvoid Java.Interop.JniPeerMembers/JniInstanceMethods:FinishCreateInstance (string,Java.Interop.IJavaPeerable,Java.Interop.JniArgumentValue*)\n\tvoid Java.Interop.JniPeerMembers/JniInstanceMethods:InvokeNonvirtualVoidMethod (string,Java.Interop.IJavaPeerable,Java.Interop.JniArgumentValue*)\n\tvoid Java.Interop.JniPeerMembers/JniInstanceMethods:InvokeVirtualVoidMethod (string,Java.Interop.IJavaPeerable,Java.Interop.JniArgumentValue*)\n\tvoid Java.Interop.JniPeerMembers/JniStaticFields:.ctor (Java.Interop.JniPeerMembers)\n\tvoid Java.Interop.JniPeerMembers/JniStaticMethods:.ctor (Java.Interop.JniPeerMembers)\n\tvoid Java.Interop.JniPeerMembers/JniStaticMethods:InvokeVoidMethod (string,Java.Interop.JniArgumentValue*)\n\tvoid Java.Interop.JniRuntime:.cctor ()\n\tvoid Java.Interop.JniRuntime:.ctor (Java.Interop.JniRuntime/CreationOptions)\n\tvoid Java.Interop.JniRuntime:set_InvocationPointer (intptr)\n\tvoid Java.Interop.JniRuntime:set_JniVersion (Java.Interop.JniVersion)\n\tvoid Java.Interop.JniRuntime:set_NewObjectRequired (bool)\n\tvoid Java.Interop.JniRuntime:set_ObjectReferenceManager (Java.Interop.JniRuntime/JniObjectReferenceManager)\n\tvoid Java.Interop.JniRuntime:set_TrackIDs (bool)\n\tvoid Java.Interop.JniRuntime:set_TypeManager (Java.Interop.JniRuntime/JniTypeManager)\n\tvoid Java.Interop.JniRuntime:SetMarshalMemberBuilder (Java.Interop.JniRuntime/CreationOptions)\n\tvoid Java.Interop.JniRuntime:SetValueManager (Java.Interop.JniRuntime/CreationOptions)\n\tvoid Java.Interop.JniRuntime:Track (Java.Interop.JniType)\n\tvoid Java.Interop.JniRuntime/CreationOptions:.ctor ()\n\tvoid Java.Interop.JniRuntime/JniObjectReferenceManager:CreatedLocalReference (Java.Interop.JniEnvironmentInfo,Java.Interop.JniObjectReference)\n\tvoid Java.Interop.JniRuntime/JniObjectReferenceManager:CreatedLocalReference (Java.Interop.JniObjectReference,int&)\n\tvoid Java.Interop.JniRuntime/JniObjectReferenceManager:DeleteGlobalReference (Java.Interop.JniObjectReference&)\n\tvoid Java.Interop.JniRuntime/JniObjectReferenceManager:DeleteLocalReference (Java.Interop.JniEnvironmentInfo,Java.Interop.JniObjectReference&)\n\tvoid Java.Interop.JniRuntime/JniObjectReferenceManager:DeleteLocalReference (Java.Interop.JniObjectReference&,int&)\n\tvoid Java.Interop.JniRuntime/JniObjectReferenceManager:OnSetRuntime (Java.Interop.JniRuntime)\n\tvoid Java.Interop.JniRuntime/JniTypeManager:.cctor ()\n\tvoid Java.Interop.JniRuntime/JniTypeManager:.ctor ()\n\tvoid Java.Interop.JniRuntime/JniTypeManager:AssertSimpleReference (string,string)\n\tvoid Java.Interop.JniRuntime/JniTypeManager:OnSetRuntime (Java.Interop.JniRuntime)\n\tvoid Java.Interop.JniRuntime/JniValueManager:.cctor ()\n\tvoid Java.Interop.JniRuntime/JniValueManager:.ctor ()\n\tvoid Java.Interop.JniRuntime/JniValueManager:DisposePeer (Java.Interop.IJavaPeerable)\n\tvoid Java.Interop.JniRuntime/JniValueManager:DisposePeer (Java.Interop.JniObjectReference,Java.Interop.IJavaPeerable)\n\tvoid Java.Interop.JniRuntime/JniValueManager:OnSetRuntime (Java.Interop.JniRuntime)\n\tvoid Java.Interop.JniTransition:.ctor (intptr)\n\tvoid Java.Interop.JniTransition:Dispose ()\n\tvoid Java.Interop.JniType:.ctor (string)\n\tvoid Java.Interop.JniType:Dispose ()\n\tvoid Java.Interop.JniType:Initialize (Java.Interop.JniObjectReference&,Java.Interop.JniObjectReferenceOptions)\n\tvoid Java.Interop.JniType:RegisterNativeMethods (Java.Interop.JniNativeMethodRegistration[])\n\tvoid Java.Interop.JniType:RegisterWithRuntime ()\n\tvoid Java.Interop.ManagedPeer:.cctor ()\n\tvoid Java.Interop.ManagedPeer:Init ()\n\tvoid Java.Interop.NativeMethods:java_interop_jnienv_call_nonvirtual_void_method_a (intptr,intptr&,intptr,intptr,intptr,intptr)\n\tvoid Java.Interop.NativeMethods:java_interop_jnienv_call_static_void_method_a (intptr,intptr&,intptr,intptr,intptr)\n\tvoid Java.Interop.NativeMethods:java_interop_jnienv_call_void_method_a (intptr,intptr&,intptr,intptr,intptr)\n\tvoid Java.Interop.NativeMethods:java_interop_jnienv_delete_global_ref (intptr,intptr)\n\tvoid Java.Interop.NativeMethods:java_interop_jnienv_delete_local_ref (intptr,intptr)\n\tvoid Java.Interop.NativeMethods:java_interop_jnienv_release_string_chars (intptr,intptr,char*)\n\tvoid Java.Interop.Tools.TypeNameMappings.JavaNativeTypeManager:.cctor ()\n\tvoid Java.Interop.Tools.TypeNameMappings.JavaNativeTypeManager:set_PackageNamingPolicy (Java.Interop.Tools.TypeNameMappings.PackageNamingPolicy)\n\tvoid Java.Interop.TypeManager:.cctor ()\n\tvoid Java.Interop.TypeManager:Activate (intptr,System.Reflection.ConstructorInfo,object[])\n\tvoid Java.Interop.TypeManager:n_Activate (intptr,intptr,intptr,intptr,intptr,intptr)\n\tvoid Java.Interop.TypeManager:RegisterType (string,System.Type)\n\tvoid Java.Interop.TypeManagerMapDictionaries:.cctor ()\n\tvoid Java.Lang.Class:.cctor ()\n\tvoid Java.Lang.Object:.cctor ()\n\tvoid Java.Lang.Object:.ctor (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Java.Lang.Object:Dispose ()\n\tvoid Java.Lang.Object:Dispose (bool)\n\tvoid Java.Lang.Object:Java.Interop.IJavaPeerable.Disposed ()\n\tvoid Java.Lang.Object:Java.Interop.IJavaPeerable.SetJniIdentityHashCode (int)\n\tvoid Java.Lang.Object:Java.Interop.IJavaPeerable.SetPeerReference (Java.Interop.JniObjectReference)\n\tvoid Java.Lang.Object:SetHandle (intptr,Android.Runtime.JniHandleOwnership)\n\tvoid Java.Lang.String:.cctor ()\n\tvoid Java.Lang.String:.ctor (string)\n\tvoid Microsoft.Maui.Graphics.Color:.ctor (single,single,single,single)\n\tvoid Microsoft.Maui.Graphics.Colors:.cctor ()\n\tvoid Mono.RuntimeGPtrArrayHandle:DestroyAndFree (Mono.RuntimeGPtrArrayHandle&)\n\tvoid Mono.RuntimeGPtrArrayHandle:GPtrArrayFree (Mono.RuntimeStructs/GPtrArray*)\n\tvoid Mono.SafeGPtrArrayHandle:Dispose ()\n\tvoid Mono.SafeStringMarshal:Dispose ()\n\tvoid Mono.SafeStringMarshal:GFree (intptr)\n\tvoid Spice.Application:.ctor ()\n\tvoid Spice.Application:OnMainChanged (Spice.View)\n\tvoid Spice.Application:OnMainChanging (Spice.View)\n\tvoid Spice.Application:set_Main (Spice.View)\n\tvoid Spice.Button:.ctor ()\n\tvoid Spice.Button:.ctor (Android.Content.Context,System.Func`2<Android.Content.Context, Android.Views.View>)\n\tvoid Spice.Button:OnClickedChanged (System.Action`1<Spice.Button>)\n\tvoid Spice.Button:OnTextChanged (string)\n\tvoid Spice.Button:set_Clicked (System.Action`1<Spice.Button>)\n\tvoid Spice.Button:set_Text (string)\n\tvoid Spice.Image:.ctor ()\n\tvoid Spice.Image:.ctor (Android.Content.Context,System.Func`2<Android.Content.Context, Android.Views.View>)\n\tvoid Spice.Image:OnSourceChanged (string)\n\tvoid Spice.Image:set_Source (string)\n\tvoid Spice.Interop:.cctor ()\n\tvoid Spice.Interop:SetImage (Android.Widget.ImageView,string)\n\tvoid Spice.Label:.ctor ()\n\tvoid Spice.Label:OnTextChanged (string)\n\tvoid Spice.Label:set_Text (string)\n\tvoid Spice.SpiceActivity:.ctor ()\n\tvoid Spice.SpiceActivity:OnCreate (Android.OS.Bundle)\n\tvoid Spice.StackLayout:.ctor ()\n\tvoid Spice.StackLayout:.ctor (Android.Content.Context,System.Func`2<Android.Content.Context, Android.Views.View>)\n\tvoid Spice.View:.ctor ()\n\tvoid Spice.View:.ctor (Android.Content.Context,System.Func`2<Android.Content.Context, Android.Views.View>)\n\tvoid Spice.View:Add (Spice.View)\n\tvoid Spice.View:OnBackgroundColorChanged (Microsoft.Maui.Graphics.Color)\n\tvoid Spice.View:OnChildrenChanged (object,System.Collections.Specialized.NotifyCollectionChangedEventArgs)\n\tvoid Spice.View:set_BackgroundColor (Microsoft.Maui.Graphics.Color)\n\tvoid System.AppContext:Setup (char**,char**,int)\n\tvoid System.ArgumentException:ThrowIfNullOrEmpty (string,string)\n\tvoid System.Array:Copy (System.Array,int,System.Array,int,int,bool)\n\tvoid System.Array:Copy (System.Array,int,System.Array,int,int)\n\tvoid System.Array:Copy (System.Array,System.Array,int)\n\tvoid System.Array/EmptyArray`1<Android.Runtime.JValue>:.cctor ()\n\tvoid System.Array/EmptyArray`1<System.Reflection.ParameterModifier>:.cctor ()\n\tvoid System.Array/EmptyArray`1<System.Type>:.cctor ()\n\tvoid System.BitConverter:.cctor ()\n\tvoid System.Boolean:.cctor ()\n\tvoid System.Buffer:Memmove (byte&,byte&,uintptr)\n\tvoid System.Collections.Generic.Dictionary`2<System.Int32, System.Boolean>:.ctor ()\n\tvoid System.Collections.Generic.Dictionary`2<System.Int32, System.Boolean>:.ctor (int,System.Collections.Generic.IEqualityComparer`1<int>)\n\tvoid System.Collections.Generic.Dictionary`2<System.Int32, System.Boolean>:Add (int,bool)\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, Android.Runtime.IdentityHashTargets>:.ctor ()\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, Android.Runtime.IdentityHashTargets>:.ctor (int,System.Collections.Generic.IEqualityComparer`1<intptr>)\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, Android.Runtime.IdentityHashTargets>:Add (intptr,Android.Runtime.IdentityHashTargets)\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, Android.Runtime.IdentityHashTargets>:Resize ()\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, Android.Runtime.IdentityHashTargets>:Resize (int,bool)\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, Java.Interop.JniRuntime>:.ctor ()\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, Java.Interop.JniRuntime>:.ctor (int,System.Collections.Generic.IEqualityComparer`1<intptr>)\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, Java.Interop.JniRuntime>:set_Item (intptr,Java.Interop.JniRuntime)\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, System.IDisposable>:.ctor ()\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, System.IDisposable>:.ctor (int,System.Collections.Generic.IEqualityComparer`1<intptr>)\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, System.IDisposable>:Resize ()\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, System.IDisposable>:Resize (int,bool)\n\tvoid System.Collections.Generic.Dictionary`2<System.IntPtr, System.IDisposable>:set_Item (intptr,System.IDisposable)\n\tvoid System.Collections.Generic.Dictionary`2<System.String, Java.Interop.JniMethodInfo>:.ctor (System.Collections.Generic.IEqualityComparer`1<string>)\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.IntPtr>:.ctor ()\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.IntPtr>:.ctor (int,System.Collections.Generic.IEqualityComparer`1<string>)\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.IntPtr>:Add (string,intptr)\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.Object>:.ctor (int,System.Collections.Generic.IEqualityComparer`1<string>)\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.Object>:.ctor (int)\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.Object>:Add (string,object)\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.Type>:Resize ()\n\tvoid System.Collections.Generic.Dictionary`2<System.String, System.Type>:Resize (int,bool)\n\tvoid System.Collections.Generic.Dictionary`2<System.Type, Java.Interop.JniValueMarshaler>:.ctor ()\n\tvoid System.Collections.Generic.GenericEqualityComparer`1<System.IntPtr>:.ctor ()\n\tvoid System.Collections.Generic.GenericEqualityComparer`1<System.String>:.ctor ()\n\tvoid System.Collections.Generic.List`1<Java.Interop.JniNativeMethodRegistration>:.cctor ()\n\tvoid System.Collections.Generic.List`1<Java.Interop.JniNativeMethodRegistration>:.ctor ()\n\tvoid System.Collections.Generic.List`1<Spice.View>:.cctor ()\n\tvoid System.Collections.Generic.List`1<Spice.View>:.ctor ()\n\tvoid System.Collections.Generic.List`1<Spice.View>:Grow (int)\n\tvoid System.Collections.Generic.List`1<Spice.View>:Insert (int,Spice.View)\n\tvoid System.Collections.Generic.List`1<Spice.View>:set_Capacity (int)\n\tvoid System.Collections.Generic.List`1<System.Int32>:.cctor ()\n\tvoid System.Collections.Generic.List`1<System.Int32>:.ctor ()\n\tvoid System.Collections.Generic.List`1<System.Int32>:Grow (int)\n\tvoid System.Collections.Generic.List`1<System.Int32>:set_Capacity (int)\n\tvoid System.Collections.Generic.NonRandomizedStringEqualityComparer:.cctor ()\n\tvoid System.Collections.Generic.NonRandomizedStringEqualityComparer:.ctor (System.Collections.Generic.IEqualityComparer`1<string>)\n\tvoid System.Collections.Generic.NonRandomizedStringEqualityComparer/OrdinalComparer:.ctor (System.Collections.Generic.IEqualityComparer`1<string>)\n\tvoid System.Collections.Generic.NonRandomizedStringEqualityComparer/OrdinalIgnoreCaseComparer:.ctor (System.Collections.Generic.IEqualityComparer`1<string>)\n\tvoid System.Collections.HashHelpers:.cctor ()\n\tvoid System.Collections.ObjectModel.Collection`1<Spice.View>:.ctor ()\n\tvoid System.Collections.ObjectModel.Collection`1<Spice.View>:Add (Spice.View)\n\tvoid System.Collections.ObjectModel.Collection`1<Spice.View>:InsertItem (int,Spice.View)\n\tvoid System.Collections.ObjectModel.EventArgsCache:.cctor ()\n\tvoid System.Collections.ObjectModel.ObservableCollection`1<Spice.View>:.ctor ()\n\tvoid System.Collections.ObjectModel.ObservableCollection`1<Spice.View>:add_CollectionChanged (System.Collections.Specialized.NotifyCollectionChangedEventHandler)\n\tvoid System.Collections.ObjectModel.ObservableCollection`1<Spice.View>:CheckReentrancy ()\n\tvoid System.Collections.ObjectModel.ObservableCollection`1<Spice.View>:InsertItem (int,Spice.View)\n\tvoid System.Collections.ObjectModel.ObservableCollection`1<Spice.View>:OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedAction,object,int)\n\tvoid System.Collections.ObjectModel.ObservableCollection`1<Spice.View>:OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedEventArgs)\n\tvoid System.Collections.ObjectModel.ObservableCollection`1<Spice.View>:OnCountPropertyChanged ()\n\tvoid System.Collections.ObjectModel.ObservableCollection`1<Spice.View>:OnIndexerPropertyChanged ()\n\tvoid System.Collections.ObjectModel.ObservableCollection`1<Spice.View>:OnPropertyChanged (System.ComponentModel.PropertyChangedEventArgs)\n\tvoid System.Collections.Specialized.NotifyCollectionChangedEventArgs:.ctor (System.Collections.Specialized.NotifyCollectionChangedAction,object,int)\n\tvoid System.Collections.Specialized.NotifyCollectionChangedEventArgs:.ctor (System.Collections.Specialized.NotifyCollectionChangedAction)\n\tvoid System.Collections.Specialized.SingleItemReadOnlyList/<GetEnumerator>d__15:System.IDisposable.Dispose ()\n\tvoid System.ComponentModel.PropertyChangingEventArgs:.ctor (string)\n\tvoid System.Environment:.cctor ()\n\tvoid System.EventArgs:.cctor ()\n\tvoid System.EventArgs:.ctor ()\n\tvoid System.GC:_SuppressFinalize (object)\n\tvoid System.GC:.cctor ()\n\tvoid System.GC:KeepAlive (object)\n\tvoid System.GC:SuppressFinalize (object)\n\tvoid System.Globalization.CalendarData:.cctor ()\n\tvoid System.Globalization.CalendarData:.ctor ()\n\tvoid System.Globalization.CompareInfo:.cctor ()\n\tvoid System.Globalization.CompareInfo:.ctor (System.Globalization.CultureInfo)\n\tvoid System.Globalization.CompareInfo:IcuInitSortHandle (string)\n\tvoid System.Globalization.CompareInfo:InitSort (System.Globalization.CultureInfo)\n\tvoid System.Globalization.CompareInfo/SortHandleCache:.cctor ()\n\tvoid System.Globalization.CultureData:.cctor ()\n\tvoid System.Globalization.CultureData:.ctor ()\n\tvoid System.Globalization.CultureInfo:.cctor ()\n\tvoid System.Globalization.CultureInfo:.ctor (System.Globalization.CultureData,bool)\n\tvoid System.Globalization.GlobalizationMode/Settings:.cctor ()\n\tvoid System.Guid:.ctor (byte[])\n\tvoid System.Guid:.ctor (System.ReadOnlySpan`1<byte>)\n\tvoid System.Lazy`1<Android.Views.View>:ExecutionAndPublication (System.LazyHelper,bool)\n\tvoid System.Lazy`1<Android.Views.View>:ViaFactory (System.Threading.LazyThreadSafetyMode)\n\tvoid System.LazyHelper:.cctor ()\n\tvoid System.LazyHelper:.ctor (System.LazyState)\n\tvoid System.Math:.cctor ()\n\tvoid System.NullReferenceException:.ctor (string)\n\tvoid System.OrdinalCaseSensitiveComparer:.cctor ()\n\tvoid System.OrdinalCaseSensitiveComparer:.ctor ()\n\tvoid System.OrdinalIgnoreCaseComparer:.cctor ()\n\tvoid System.OrdinalIgnoreCaseComparer:.ctor ()\n\tvoid System.OutOfMemoryException:.ctor (string)\n\tvoid System.Reflection.ConstructorInfo:.cctor ()\n\tvoid System.Reflection.Emit.OpCodes:.cctor ()\n\tvoid System.Reflection.MethodBase:ValidateInvokeTarget (object)\n\tvoid System.Reflection.Missing:.cctor ()\n\tvoid System.Reflection.Missing:.ctor ()\n\tvoid System.Reflection.MonoMethodInfo:get_method_info (intptr,System.Reflection.MonoMethodInfo&)\n\tvoid System.Reflection.RuntimeModule:GetGuidInternal (intptr,byte[])\n\tvoid System.Runtime.CompilerServices.QCallTypeHandle:.ctor (System.RuntimeType&)\n\tvoid System.Runtime.InteropServices.GCHandle:.ctor (object,System.Runtime.InteropServices.GCHandleType)\n\tvoid System.Runtime.InteropServices.Marshal:.cctor ()\n\tvoid System.Runtime.InteropServices.Marshal:PtrToStructureHelper (intptr,object,bool)\n\tvoid System.Runtime.InteropServices.Marshal:PtrToStructureInternal (intptr,object,bool)\n\tvoid System.Runtime.InteropServices.Marshalling.Utf8StringMarshaller/ManagedToUnmanagedIn:Free ()\n\tvoid System.Runtime.InteropServices.Marshalling.Utf8StringMarshaller/ManagedToUnmanagedIn:FromManaged (string,System.Span`1<byte>)\n\tvoid System.RuntimeType:.cctor ()\n\tvoid System.RuntimeType:CreateInstanceCheckThis ()\n\tvoid System.RuntimeType:FilterHelper (System.Reflection.BindingFlags,string&,bool,bool&,bool&,System.RuntimeType/MemberListType&)\n\tvoid System.RuntimeType:GetName (System.Runtime.CompilerServices.QCallTypeHandle,System.Runtime.CompilerServices.ObjectHandleOnStack)\n\tvoid System.RuntimeType:make_byref_type (System.Runtime.CompilerServices.QCallTypeHandle,System.Runtime.CompilerServices.ObjectHandleOnStack)\n\tvoid System.RuntimeType:MakeGenericType (System.Type,System.Type[],System.Runtime.CompilerServices.ObjectHandleOnStack)\n\tvoid System.RuntimeType/ListBuilder`1<System.Reflection.ConstructorInfo>:.ctor (int)\n\tvoid System.RuntimeType/ListBuilder`1<System.Reflection.ConstructorInfo>:Add (System.Reflection.ConstructorInfo)\n\tvoid System.RuntimeTypeHandle:GetBaseType (System.Runtime.CompilerServices.QCallTypeHandle,System.Runtime.CompilerServices.ObjectHandleOnStack)\n\tvoid System.RuntimeTypeHandle:GetGenericTypeDefinition_impl (System.Runtime.CompilerServices.QCallTypeHandle,System.Runtime.CompilerServices.ObjectHandleOnStack)\n\tvoid System.RuntimeTypeHandle:GetModule (System.Runtime.CompilerServices.QCallTypeHandle,System.Runtime.CompilerServices.ObjectHandleOnStack)\n\tvoid System.RuntimeTypeHandle:internal_from_name (intptr,System.Threading.StackCrawlMark&,System.Runtime.CompilerServices.ObjectHandleOnStack,bool,bool)\n\tvoid System.StackOverflowException:.ctor (string)\n\tvoid System.String:.ctor (char*,int,int)\n\tvoid System.String:.ctor (char*)\n\tvoid System.String:.ctor (sbyte*)\n\tvoid System.String:.ctor (System.ReadOnlySpan`1<char>)\n\tvoid System.String:memcpy (byte*,byte*,int)\n\tvoid System.String:memset (byte*,int,int)\n\tvoid System.Text.DecoderReplacementFallback:.cctor ()\n\tvoid System.Text.DecoderReplacementFallback:.ctor ()\n\tvoid System.Text.DecoderReplacementFallback:.ctor (string)\n\tvoid System.Text.EncoderReplacementFallback:.cctor ()\n\tvoid System.Text.EncoderReplacementFallback:.ctor ()\n\tvoid System.Text.EncoderReplacementFallback:.ctor (string)\n\tvoid System.Text.Encoding:.cctor ()\n\tvoid System.Text.Encoding:.ctor (int)\n\tvoid System.Text.UTF8Encoding:.cctor ()\n\tvoid System.Text.UTF8Encoding:.ctor ()\n\tvoid System.Text.UTF8Encoding:.ctor (bool)\n\tvoid System.Text.UTF8Encoding:SetDefaultFallbacks ()\n\tvoid System.Text.UTF8Encoding/UTF8EncodingSealed:.ctor (bool)\n\tvoid System.Threading.Monitor:Exit (object)\n\tvoid System.Threading.SynchronizationContext:SetSynchronizationContext (System.Threading.SynchronizationContext)\n\tvoid System.Threading.ThreadLocal`1/IdManager<Java.Interop.JniEnvironmentInfo>:.ctor ()\n\tvoid System.Threading.ThreadLocal`1<Java.Interop.JniEnvironmentInfo>:.cctor ()\n\tvoid System.Threading.ThreadLocal`1<Java.Interop.JniEnvironmentInfo>:.ctor (System.Func`1<Java.Interop.JniEnvironmentInfo>,bool)\n\tvoid System.Threading.ThreadLocal`1<Java.Interop.JniEnvironmentInfo>:CreateLinkedSlot (System.Threading.ThreadLocal`1/LinkedSlotVolatile<Java.Interop.JniEnvironmentInfo>[],int,Java.Interop.JniEnvironmentInfo)\n\tvoid System.Threading.ThreadLocal`1<Java.Interop.JniEnvironmentInfo>:Initialize (System.Func`1<Java.Interop.JniEnvironmentInfo>,bool)\n\tvoid System.Threading.ThreadLocal`1<Java.Interop.JniEnvironmentInfo>:set_Value (Java.Interop.JniEnvironmentInfo)\n\tvoid System.Threading.ThreadLocal`1<Java.Interop.JniEnvironmentInfo>:SetValueSlow (Java.Interop.JniEnvironmentInfo,System.Threading.ThreadLocal`1/LinkedSlotVolatile<Java.Interop.JniEnvironmentInfo>[])\n\tvoid System.Type:.cctor ()\n\tvoid System.Type/<>c:.cctor ()\n\tvoid System.Type/<>c:.ctor ()\n\tvoid System.WeakReference:.ctor (object,bool)\n\tvoid System.WeakReference:Create (object,bool)\n\tvoid System.WeakReference`1<Java.Interop.IJavaPeerable>:.ctor (Java.Interop.IJavaPeerable,bool)\n\tvoid System.WeakReference`1<Java.Interop.IJavaPeerable>:Create (Java.Interop.IJavaPeerable,bool)\n"
  },
  {
    "path": "src/Spice/Platforms/Android/ActivityIndicator.cs",
    "content": "using Android.Content;\nusing AndroidProgressBar = Android.Widget.ProgressBar;\n\nnamespace Spice;\n\npublic partial class ActivityIndicator\n{\n\t/// <summary>\n\t/// Returns activityIndicator.NativeView\n\t/// </summary>\n\t/// <param name=\"activityIndicator\">The Spice.ActivityIndicator</param>\n\tpublic static implicit operator AndroidProgressBar(ActivityIndicator activityIndicator) => activityIndicator.NativeView;\n\n\tstatic AndroidProgressBar Create(Context context)\n\t{\n\t\tvar progressBar = new AndroidProgressBar(context);\n\t\tprogressBar.Indeterminate = true;\n\t\tprogressBar.Visibility = Android.Views.ViewStates.Gone;\n\t\treturn progressBar;\n\t}\n\n\t/// <summary>\n\t/// Represents a loading spinner on screen. Set the IsRunning property to true to show the spinner.\n\t/// Android -> Android.Widget.ProgressBar (indeterminate)\n\t/// iOS -> UIKit.UIActivityIndicatorView\n\t/// </summary>\n\tpublic ActivityIndicator() : base(Platform.Context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic ActivityIndicator(Context context) : base(context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected ActivityIndicator(Func<Context, Android.Views.View> creator) : base(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected ActivityIndicator(Context context, Func<Context, Android.Views.View> creator) : base(context, creator) { }\n\n\t/// <summary>\n\t/// The underlying Android.Widget.ProgressBar\n\t/// </summary>\n\tpublic new AndroidProgressBar NativeView => (AndroidProgressBar)_nativeView.Value;\n\n\tpartial void OnIsRunningChanged(bool value)\n\t{\n\t\tNativeView.Visibility = value ? Android.Views.ViewStates.Visible : Android.Views.ViewStates.Gone;\n\t}\n\n\tpartial void OnColorChanged(Color? value)\n\t{\n\t\tif (value != null)\n\t\t{\n\t\t\tNativeView.IndeterminateDrawable?.SetTint(value.ToAndroidInt());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tNativeView.IndeterminateDrawable?.ClearColorFilter();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/Application.cs",
    "content": "using Android.Content;\n\nnamespace Spice;\n\npublic partial class Application\n{\n\t/// <summary>\n\t/// The root \"view\" of a Spice application. Set Main to a single view.\n\t/// </summary>\n\tpublic Application() { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic Application(Context context) : base(context) { }\n\n\t/// <inheritdoc />\n\tprotected override Android.Views.ViewGroup.LayoutParams CreateLayoutParameters() =>\n\t\tnew RelativeLayout.LayoutParams(Android.Views.ViewGroup.LayoutParams.MatchParent, Android.Views.ViewGroup.LayoutParams.MatchParent);\n\n\tpartial void OnMainChanging(View? value)\n\t{\n\t\tif (_main != null)\n\t\t{\n\t\t\tNativeView.RemoveView(_main);\n\t\t}\n\t}\n\n\tpartial void OnMainChanged(View? value)\n\t{\n\t\tif (value != null)\n\t\t{\n\t\t\tNativeView.AddView(value);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/Blazor/AndroidAssetFileProvider.cs",
    "content": "﻿// From: https://github.com/dotnet/maui/blob/260fa08b0f75fbbb945375592896dd9eb374f22f/src/BlazorWebView/src/Maui/Android/AndroidMauiAssetFileProvider.cs\n\nusing System.Buffers;\nusing System.Collections;\n\nusing Android.Content.Res;\n\nusing Microsoft.Extensions.FileProviders;\nusing Microsoft.Extensions.Primitives;\n\nnamespace Microsoft.AspNetCore.Components.WebView.Maui\n{\n\t/// <summary>\n\t/// A minimal implementation of an IFileProvider to be used by the BlazorWebView and WebViewManager types.\n\t/// </summary>\n\tinternal sealed class AndroidAssetFileProvider : IFileProvider\n\t{\n\t\tprivate readonly AssetManager _assets;\n\t\tprivate readonly string _contentRootDir;\n\n\t\tpublic AndroidAssetFileProvider(AssetManager? assets, string contentRootDir)\n\t\t{\n\t\t\t_assets = assets ?? throw new ArgumentNullException(nameof(assets));\n\t\t\t_contentRootDir = contentRootDir;\n\t\t}\n\n\t\tpublic IDirectoryContents GetDirectoryContents(string subpath)\n\t\t\t=> new AndroidMauiAssetDirectoryContents(_assets, Path.Combine(_contentRootDir, subpath));\n\n\t\tpublic IFileInfo GetFileInfo(string subpath)\n\t\t\t=> new AndroidMauiAssetFileInfo(_assets, Path.Combine(_contentRootDir, subpath));\n\n\t\tpublic IChangeToken Watch(string filter)\n\t\t\t=> NullChangeToken.Singleton;\n\n\t\tprivate sealed class AndroidMauiAssetFileInfo : IFileInfo\n\t\t{\n\t\t\tprivate readonly AssetManager _assets;\n\t\t\tprivate readonly string _filePath;\n\t\t\tprivate readonly Lazy<bool> _lazyAssetExists;\n\t\t\tprivate readonly Lazy<long> _lazyAssetLength;\n\n\t\t\tpublic AndroidMauiAssetFileInfo(AssetManager assets, string filePath)\n\t\t\t{\n\t\t\t\t_assets = assets;\n\t\t\t\t_filePath = filePath;\n\n\t\t\t\tName = Path.GetFileName(filePath);\n\n\t\t\t\t_lazyAssetExists = new Lazy<bool>(() =>\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tusing var stream = _assets.Open(_filePath);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tcatch\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\n\t\t\t\t_lazyAssetLength = new Lazy<long>(() =>\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\t// The stream returned by AssetManager.Open() is not seekable, so we have to read\n\t\t\t\t\t\t// the contents to get its length. In practice, Length is never called by BlazorWebView,\n\t\t\t\t\t\t// so it's here \"just in case.\"\n\t\t\t\t\t\tusing var stream = _assets.Open(_filePath);\n\n\t\t\t\t\t\tvar buffer = ArrayPool<byte>.Shared.Rent(4096);\n\t\t\t\t\t\tlong length = 0;\n\t\t\t\t\t\twhile (length != (length += stream.Read(buffer)))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// just read the stream to get its length; we don't need the contents here\n\t\t\t\t\t\t}\n\t\t\t\t\t\tArrayPool<byte>.Shared.Return(buffer);\n\t\t\t\t\t\treturn length;\n\t\t\t\t\t}\n\t\t\t\t\tcatch\n\t\t\t\t\t{\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tpublic bool Exists => _lazyAssetExists.Value;\n\t\t\tpublic long Length => _lazyAssetLength.Value;\n\t\t\tpublic string PhysicalPath { get; } = null!;\n\t\t\tpublic string Name { get; }\n\t\t\tpublic DateTimeOffset LastModified { get; } = DateTimeOffset.FromUnixTimeSeconds(0);\n\t\t\tpublic bool IsDirectory => false;\n\n\t\t\tpublic Stream CreateReadStream()\n\t\t\t\t=> _assets.Open(_filePath);\n\t\t}\n\n\t\t// This is never used by BlazorWebView or WebViewManager\n\t\tprivate sealed class AndroidMauiAssetDirectoryContents : IDirectoryContents\n\t\t{\n\t\t\tpublic AndroidMauiAssetDirectoryContents(AssetManager assets, string filePath)\n\t\t\t{\n\t\t\t}\n\n\t\t\tpublic bool Exists => false;\n\n\t\t\tpublic IEnumerator<IFileInfo> GetEnumerator()\n\t\t\t\t=> throw new NotImplementedException();\n\n\t\t\tIEnumerator IEnumerable.GetEnumerator()\n\t\t\t\t=> throw new NotImplementedException();\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/Spice/Platforms/Android/Blazor/AndroidWebViewManager.cs",
    "content": "﻿// From: https://github.com/dotnet/maui/blob/260fa08b0f75fbbb945375592896dd9eb374f22f/src/BlazorWebView/src/Maui/Android/AndroidWebKitWebViewManager.cs\n\nusing System.Runtime.Versioning;\n\nusing Android.Webkit;\n\nusing Microsoft.AspNetCore.Components.Web;\nusing Microsoft.Extensions.FileProviders;\n\nusing Spice;\n\nusing AUri = Android.Net.Uri;\nusing AWebView = Android.Webkit.WebView;\n\nnamespace Microsoft.AspNetCore.Components.WebView.Maui\n{\n\t/// <summary>\n\t/// An implementation of <see cref=\"WebViewManager\"/> that uses the Android WebKit WebView browser control\n\t/// to render web content.\n\t/// </summary>\n\t[SupportedOSPlatform(\"android23.0\")]\n\tinternal class AndroidWebViewManager : WebViewManager\n\t{\n\t\t// Using an IP address means that WebView doesn't wait for any DNS resolution,\n\t\t// making it substantially faster. Note that this isn't real HTTP traffic, since\n\t\t// we intercept all the requests within this origin.\n\t\tprivate static readonly string AppOrigin = $\"https://{BlazorWebView.AppHostAddress}/\";\n\t\tprivate static readonly Uri AppOriginUri = new(AppOrigin);\n\t\tprivate static readonly AUri AndroidAppOriginUri = AUri.Parse(AppOrigin)!;\n\t\tprivate readonly AWebView _webview;\n\t\tprivate readonly string _contentRootRelativeToAppRoot;\n\n\t\t/// <summary>\n\t\t/// Constructs an instance of <see cref=\"AndroidWebViewManager\"/>.\n\t\t/// </summary>\n\t\t/// <param name=\"webview\">A wrapper to access platform-specific WebView APIs.</param>\n\t\t/// <param name=\"services\">A service provider containing services to be used by this class and also by application code.</param>\n\t\t/// <param name=\"dispatcher\">A <see cref=\"Dispatcher\"/> instance that can marshal calls to the required thread or sync context.</param>\n\t\t/// <param name=\"fileProvider\">Provides static content to the webview.</param>\n\t\t/// <param name=\"jsComponents\">Describes configuration for adding, removing, and updating root components from JavaScript code.</param>\n\t\t/// <param name=\"contentRootRelativeToAppRoot\">Path to the directory containing application content files.</param>\n\t\t/// <param name=\"hostPageRelativePath\">Path to the host page within the <paramref name=\"fileProvider\"/>.</param>\n\t\tpublic AndroidWebViewManager(AWebView webview, IServiceProvider services, Dispatcher dispatcher, IFileProvider fileProvider, JSComponentConfigurationStore jsComponents, string contentRootRelativeToAppRoot, string hostPageRelativePath)\n\t\t\t: base(services, dispatcher, AppOriginUri, fileProvider, jsComponents, hostPageRelativePath)\n\t\t{\n\t\t\tArgumentNullException.ThrowIfNull(webview);\n\t\t\t_webview = webview;\n\t\t\t_contentRootRelativeToAppRoot = contentRootRelativeToAppRoot;\n\t\t}\n\n\t\t/// <inheritdoc />\n\t\tprotected override void NavigateCore(Uri absoluteUri)\n\t\t{\n\t\t\t_webview.LoadUrl(absoluteUri.AbsoluteUri);\n\t\t}\n\n\t\t/// <inheritdoc />\n\t\tprotected override void SendMessage(string message)\n\t\t{\n\t\t\t_webview.PostWebMessage(new WebMessage(message), AndroidAppOriginUri);\n\t\t}\n\n\t\tinternal bool TryGetResponseContentInternal(string uri, bool allowFallbackOnHostPage, out int statusCode, out string statusMessage, out Stream content, out IDictionary<string, string> headers)\n\t\t{\n\t\t\treturn TryGetResponseContent(uri, allowFallbackOnHostPage, out statusCode, out statusMessage, out content, out headers);\n\n\t\t\t//TODO: hot reload support?\n\t\t\t//var hotReloadedResult = StaticContentHotReloadManager.TryReplaceResponseContent(_contentRootRelativeToAppRoot, uri, ref statusCode, ref content, headers);\n\t\t\t//return defaultResult || hotReloadedResult;\n\t\t}\n\n\t\tinternal void SetUpMessageChannel()\n\t\t{\n\t\t\t// These ports will be closed automatically when the webview gets disposed.\n\t\t\tvar nativeToJSPorts = _webview.CreateWebMessageChannel();\n\n\t\t\tvar nativeToJs = new BlazorWebMessageCallback(message =>\n\t\t\t{\n\t\t\t\tMessageReceived(AppOriginUri, message!);\n\t\t\t});\n\n\t\t\tvar destPort = new[] { nativeToJSPorts[1] };\n\n\t\t\tnativeToJSPorts[0].SetWebMessageCallback(nativeToJs);\n\n\t\t\t_webview.PostWebMessage(new WebMessage(\"capturePort\", destPort), AndroidAppOriginUri);\n\t\t}\n\n\t\tprivate class BlazorWebMessageCallback : WebMessagePort.WebMessageCallback\n\t\t{\n\t\t\tprivate readonly Action<string?> _onMessageReceived;\n\n\t\t\tpublic BlazorWebMessageCallback(Action<string?> onMessageReceived)\n\t\t\t{\n\t\t\t\t_onMessageReceived = onMessageReceived ?? throw new ArgumentNullException(nameof(onMessageReceived));\n\t\t\t}\n\n\t\t\tpublic override void OnMessage(WebMessagePort? port, WebMessage? message)\n\t\t\t{\n\t\t\t\tArgumentNullException.ThrowIfNull(message);\n\t\t\t\t_onMessageReceived(message.Data);\n\t\t\t}\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/Spice/Platforms/Android/Blazor/BlazorWebView.cs",
    "content": "﻿using System.Runtime.Versioning;\n\nusing Android.Content;\n\nusing Microsoft.AspNetCore.Components.WebView.Maui;\n\nnamespace Spice;\n\n[SupportedOSPlatform(\"android23.0\")]\npublic partial class BlazorWebView\n{\n\t/// <summary>\n\t/// Returns view.NativeView\n\t/// </summary>\n\t/// <param name=\"view\">The Spice.BlazorWebView</param>\n\tpublic static implicit operator Android.Webkit.WebView(BlazorWebView view) => view.NativeView;\n\n\t/// <summary>\n\t/// A \"web view\" for rendering Blazor/.razor content on each platform.\n\t/// Android -> Android.Webkit.WebView\n\t/// iOS -> WebKit.WKWebView\n\t/// </summary>\n\tpublic BlazorWebView() : this(Platform.Context, Create) => Initialize();\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic BlazorWebView(Context context) : this(context, Create) => Initialize();\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected BlazorWebView(Func<Context, Android.Views.View> creator) : this(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected BlazorWebView(Context context, Func<Context, Android.Views.View> creator) : base(context, creator) { }\n\n\tstatic AndroidAssetFileProvider? _fileProvider;\n\tAndroidWebViewManager? _webViewManager;\n\n\tinternal AndroidWebViewManager? Manager => _webViewManager;\n\n\t/// <inheritdoc />\n\tprotected override void SetClients()\n\t{\n\t\tvar view = NativeView;\n\t\tview.SetWebViewClient(new SpiceBlazorWebViewClient(this));\n\t\tview.SetWebChromeClient(new SpiceWebChromeClient());\n\t}\n\n\tpartial void LoadNativeWebView(string contentRootDir, string hostPageRelativePath)\n\t{\n\t\tif (_fileProvider is null)\n\t\t{\n\t\t\t_fileProvider = new AndroidAssetFileProvider(NativeView.Context!.Assets, contentRootDir);\n\t\t}\n\t\t_webViewManager = new AndroidWebViewManager(NativeView, SpiceServiceProvider.Instance, SpiceDispatcher.Instance, _fileProvider, _jSComponents, contentRootDir, hostPageRelativePath);\n\n\t\tforeach (var component in RootComponents)\n\t\t{\n\t\t\t// Since the page isn't loaded yet, this will always complete synchronously\n\t\t\t_ = component.AddToWebViewManagerAsync(_webViewManager);\n\t\t}\n\n\t\t_webViewManager.Navigate(StartPath);\n\t}\n}"
  },
  {
    "path": "src/Spice/Platforms/Android/Blazor/SpiceBlazorWebViewClient.cs",
    "content": "﻿// From: https://github.com/dotnet/maui/blob/260fa08b0f75fbbb945375592896dd9eb374f22f/src/BlazorWebView/src/Maui/Android/WebKitWebViewClient.cs\n\nusing System.Runtime.Versioning;\n\nusing Android.Content;\nusing Android.Runtime;\nusing Android.Webkit;\n\nusing Java.Net;\n\nusing Microsoft.AspNetCore.Components.WebView.Maui;\n\nusing AWebView = Android.Webkit.WebView;\n\nnamespace Spice;\n\n[SupportedOSPlatform(\"android23.0\")]\ninternal class SpiceBlazorWebViewClient : WebViewClient\n{\n\t// Using an IP address means that WebView doesn't wait for any DNS resolution,\n\t// making it substantially faster. Note that this isn't real HTTP traffic, since\n\t// we intercept all the requests within this origin.\n\tprivate static readonly string AppOrigin = $\"https://{BlazorWebView.AppHostAddress}/\";\n\tprivate static readonly Uri AppOriginUri = new(AppOrigin);\n\treadonly BlazorWebView? _webView;\n\n\tpublic SpiceBlazorWebViewClient(BlazorWebView webView) => _webView = webView;\n\n\tprotected SpiceBlazorWebViewClient(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)\n\t{\n\t\t// This constructor is called whenever the .NET proxy was disposed, and it was recreated by Java. It also\n\t\t// happens when overridden methods are called between execution of this constructor and the one above.\n\t\t// because of these facts, we have to check all methods below for null field references and properties.\n\t}\n\n\tpublic override bool ShouldOverrideUrlLoading(AWebView? view, IWebResourceRequest? request)\n#pragma warning disable CA1416 // TODO: base.ShouldOverrideUrlLoading(,) is supported from Android 24.0\n\t\t=> ShouldOverrideUrlLoadingCore(request) || base.ShouldOverrideUrlLoading(view, request);\n#pragma warning restore CA1416\n\n\tprivate bool ShouldOverrideUrlLoadingCore(IWebResourceRequest? request)\n\t{\n\t\tif (_webView?.Manager is not AndroidWebViewManager manager || !Uri.TryCreate(request?.Url?.ToString(), UriKind.RelativeOrAbsolute, out var uri))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// This method never gets called for navigation to a new window ('_blank'),\n\t\t// so we know we can safely invoke the UrlLoading event.\n\t\tif (!AppOriginUri.IsBaseOf(uri))\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar intent = Intent.ParseUri(uri.OriginalString, IntentUriType.Scheme);\n\t\t\t\t_webView.NativeView.Context!.StartActivity(intent);\n\t\t\t}\n\t\t\tcatch (URISyntaxException)\n\t\t\t{\n\t\t\t\t// This can occur if there is a problem with the URI formatting given its specified scheme.\n\t\t\t\t// Other platforms will silently ignore formatting issues, so we do the same here.\n\t\t\t}\n\t\t\tcatch (ActivityNotFoundException)\n\t\t\t{\n\t\t\t\t// Do nothing if there is no activity to handle the intent. This is consistent with the\n\t\t\t\t// behavior on other platforms when a URL with an unknown scheme is clicked.\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic override WebResourceResponse? ShouldInterceptRequest(AWebView? view, IWebResourceRequest? request)\n\t{\n\t\tif (request is null)\n\t\t{\n\t\t\tthrow new ArgumentNullException(nameof(request));\n\t\t}\n\n\t\tvar requestUri = request?.Url?.ToString();\n\t\tvar allowFallbackOnHostPage = AppOriginUri.IsBaseOfPage(requestUri);\n\t\trequestUri = UriExtensions.RemovePossibleQueryString(requestUri);\n\n\t\tif (requestUri != null &&\n\t\t\t_webView?.Manager is AndroidWebViewManager manager &&\n\t\t\tmanager.TryGetResponseContentInternal(requestUri, allowFallbackOnHostPage, out var statusCode, out var statusMessage, out var content, out var headers))\n\t\t{\n\t\t\tvar contentType = headers[\"Content-Type\"];\n\t\t\treturn new WebResourceResponse(contentType, \"UTF-8\", statusCode, statusMessage, headers, content);\n\t\t}\n\n\t\treturn base.ShouldInterceptRequest(view, request);\n\t}\n\n\tpublic override void OnPageFinished(AWebView? view, string? url)\n\t{\n\t\tbase.OnPageFinished(view, url);\n\n\t\tif (view != null && url != null && AppOriginUri.IsBaseOfPage(url))\n\t\t{\n\t\t\t// Startup scripts must run in OnPageFinished. If scripts are run earlier they will have no lasting\n\t\t\t// effect because once the page content loads all the document state gets reset.\n\t\t\tRunBlazorStartupScripts(view);\n\t\t}\n\t}\n\n\tprivate void RunBlazorStartupScripts(AWebView view)\n\t{\n\t\t// Confirm Blazor hasn't already initialized\n\t\tview.EvaluateJavascript(@\"\n\t\t\t\t(function() { return typeof(window.__BlazorStarted); })();\n\t\t\t\", new JavaScriptValueCallback(blazorStarted =>\n\t\t{\n\t\t\tif (blazorStarted?.ToString() != \"\\\"undefined\\\"\")\n\t\t\t{\n\t\t\t\t// Blazor has already started, we can just abort startup process\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set up JS ports\n\t\t\tview.EvaluateJavascript(@\"\n\n\t\tconst channel = new MessageChannel();\n\t\tvar nativeJsPortOne = channel.port1;\n\t\tvar nativeJsPortTwo = channel.port2;\n\t\twindow.addEventListener('message', function (event) {\n\t\t\tif (event.data != 'capturePort') {\n\t\t\t\tnativeJsPortOne.postMessage(event.data)\n\t\t\t}\n\t\t\telse if (event.data == 'capturePort') {\n\t\t\t\tif (event.ports[0] != null) {\n\t\t\t\t\tnativeJsPortTwo = event.ports[0]\n\t\t\t\t}\n\t\t\t}\n\t\t}, false);\n\n\t\tnativeJsPortOne.addEventListener('message', function (event) {\n\t\t}, false);\n\n\t\tnativeJsPortTwo.addEventListener('message', function (event) {\n\t\t\t// data from native code to JS\n\t\t\tif (window.external.__callback) {\n\t\t\t\twindow.external.__callback(event.data);\n\t\t\t}\n\t\t}, false);\n\t\tnativeJsPortOne.start();\n\t\tnativeJsPortTwo.start();\n\n\t\twindow.external.sendMessage = function (message) {\n\t\t\t// data from JS to native code\n\t\t\tnativeJsPortTwo.postMessage(message);\n\t\t};\n\n\t\twindow.external.receiveMessage = function (callback) {\n\t\t\twindow.external.__callback = callback;\n\t\t}\n\t\t\t\t\", new JavaScriptValueCallback(_ =>\n\t\t\t{\n\t\t\t\t// Set up Server ports\n\t\t\t\t_webView?.Manager?.SetUpMessageChannel();\n\n\t\t\t\t// Start Blazor\n\t\t\t\tview.EvaluateJavascript(@\"\n\t\t\t\t\t\t\tBlazor.start();\n\t\t\t\t\t\t\twindow.__BlazorStarted = true;\n\t\t\t\t\t\t\", new JavaScriptValueCallback(_ =>\n\t\t\t\t{\n\t\t\t\t\t// Done; no more action required\n\t\t\t\t}));\n\t\t\t}));\n\t\t}));\n\t}\n\n\tprivate class JavaScriptValueCallback : Java.Lang.Object, IValueCallback\n\t{\n\t\tprivate readonly Action<Java.Lang.Object?> _callback;\n\n\t\tpublic JavaScriptValueCallback(Action<Java.Lang.Object?> callback)\n\t\t{\n\t\t\tArgumentNullException.ThrowIfNull(callback);\n\t\t\t_callback = callback;\n\t\t}\n\n\t\tpublic void OnReceiveValue(Java.Lang.Object? value)\n\t\t{\n\t\t\t_callback(value);\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/Spice/Platforms/Android/Blazor/SpiceDispatcher.cs",
    "content": "﻿using Android.OS;\n\nusing Microsoft.AspNetCore.Components;\n\nnamespace Spice;\n\ninternal partial class SpiceDispatcher : Dispatcher\n{\n\treadonly Looper _looper;\n\treadonly Handler _handler;\n\n\tpublic SpiceDispatcher()\n\t{\n\t\t_looper = Looper.MainLooper ?? throw new ArgumentNullException(\"Android.OS.Looper.MainLooper\");\n\t\t_handler = new Handler(_looper);\n\t}\n\n\tpublic override bool CheckAccess() => _looper == Looper.MyLooper();\n\n\tpublic override Task InvokeAsync(Action workItem)\n\t{\n\t\tvar tcs = new TaskCompletionSource<object>();\n\n\t\t_handler.Post(() =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tworkItem();\n\t\t\t\ttcs.SetResult(new object());\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\ttcs.SetException(ex);\n\t\t\t}\n\t\t});\n\n\t\treturn tcs.Task;\n\t}\n\n\tpublic override Task InvokeAsync(Func<Task> workItem)\n\t{\n\t\tvar tcs = new TaskCompletionSource<object>();\n\n\t\t_handler.Post(async () =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tawait workItem();\n\t\t\t\ttcs.SetResult(new object());\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\ttcs.SetException(ex);\n\t\t\t}\n\t\t});\n\n\t\treturn tcs.Task;\n\t}\n\n\tpublic override Task<TResult> InvokeAsync<TResult>(Func<TResult> workItem)\n\t{\n\t\tvar tcs = new TaskCompletionSource<TResult>();\n\n\t\t_handler.Post(() =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\ttcs.SetResult(workItem());\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\ttcs.SetException(ex);\n\t\t\t}\n\t\t});\n\n\t\treturn tcs.Task;\n\t}\n\n\tpublic override Task<TResult> InvokeAsync<TResult>(Func<Task<TResult>> workItem)\n\t{\n\t\tvar tcs = new TaskCompletionSource<TResult>();\n\n\t\t_handler.Post(async () =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\ttcs.SetResult(await workItem());\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\ttcs.SetException(ex);\n\t\t\t}\n\t\t});\n\n\t\treturn tcs.Task;\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/Border.cs",
    "content": "using Android.Content;\nusing Android.Content.Res;\nusing Android.Graphics.Drawables;\n\nnamespace Spice;\n\npublic partial class Border\n{\n\t/// <summary>\n\t/// Returns border.NativeView\n\t/// </summary>\n\t/// <param name=\"border\">The Spice.Border</param>\n\tpublic static implicit operator Android.Views.View(Border border) => border.NativeView;\n\n\tstatic Android.Widget.FrameLayout Create(Context context) => new(context);\n\n\t/// <summary>\n\t/// Represents a border around a single child view. Set Content to a View, and customize with Stroke, StrokeThickness, CornerRadius, and Padding.\n\t/// Android -> FrameLayout with GradientDrawable background\n\t/// </summary>\n\tpublic Border() : base(Platform.Context, Create)\n\t{\n\t\t// Subscribe to PropertyChanged to intercept BackgroundColor changes\n\t\t// This is a self-reference and won't prevent garbage collection\n\t\tPropertyChanged += OnPropertyChanged;\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic Border(Context context) : base(context, Create)\n\t{\n\t\t// Subscribe to PropertyChanged to intercept BackgroundColor changes\n\t\t// This is a self-reference and won't prevent garbage collection\n\t\tPropertyChanged += OnPropertyChanged;\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected Border(Context context, Func<Context, Android.Views.View> creator) : base(context, creator)\n\t{\n\t\t// Subscribe to PropertyChanged to intercept BackgroundColor changes\n\t\t// This is a self-reference and won't prevent garbage collection\n\t\tPropertyChanged += OnPropertyChanged;\n\t}\n\n\t/// <summary>\n\t/// The underlying Android.Widget.FrameLayout\n\t/// </summary>\n\tpublic new Android.Widget.FrameLayout NativeView => (Android.Widget.FrameLayout)_nativeView.Value;\n\n\tGradientDrawable? _borderDrawable;\n\n\tGradientDrawable GetOrCreateBorderDrawable()\n\t{\n\t\tif (_borderDrawable == null)\n\t\t{\n\t\t\t_borderDrawable = new GradientDrawable();\n\t\t\tif (BackgroundColor != null)\n\t\t\t{\n\t\t\t\t_borderDrawable.SetColor(BackgroundColor.ToAndroidInt());\n\t\t\t}\n\t\t\tNativeView.Background = _borderDrawable;\n\t\t}\n\t\treturn _borderDrawable;\n\t}\n\n\tpartial void OnContentChanged(View? oldValue, View? newValue)\n\t{\n\t\tif (oldValue != null)\n\t\t{\n\t\t\tNativeView.RemoveView(oldValue);\n\t\t}\n\n\t\tif (newValue != null)\n\t\t{\n\t\t\tNativeView.AddView(newValue);\n\t\t\tUpdateContentPadding();\n\t\t}\n\t}\n\n\tpartial void OnStrokeChanged(Color? value)\n\t{\n\t\tvar drawable = GetOrCreateBorderDrawable();\n\t\tif (value != null)\n\t\t{\n\t\t\tdrawable.SetStroke(StrokeThickness.ToPixels(), ColorStateList.ValueOf(value.ToAndroidColor()));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdrawable.SetStroke(0, ColorStateList.ValueOf(Android.Graphics.Color.Transparent));\n\t\t}\n\t}\n\n\tpartial void OnStrokeThicknessChanged(double value)\n\t{\n\t\tvar drawable = GetOrCreateBorderDrawable();\n\t\tif (Stroke != null)\n\t\t{\n\t\t\tdrawable.SetStroke(value.ToPixels(), ColorStateList.ValueOf(Stroke.ToAndroidColor()));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdrawable.SetStroke(value.ToPixels(), ColorStateList.ValueOf(Android.Graphics.Color.Transparent));\n\t\t}\n\t\tUpdateContentPadding();\n\t}\n\n\tpartial void OnCornerRadiusChanged(double value)\n\t{\n\t\tvar drawable = GetOrCreateBorderDrawable();\n\t\tdrawable.SetCornerRadius((float)value.ToPixels());\n\t}\n\n\tpartial void OnPaddingChanged(double value)\n\t{\n\t\tUpdateContentPadding();\n\t}\n\n\tvoid UpdateContentPadding()\n\t{\n\t\tvar paddingPx = (Padding + StrokeThickness).ToPixels();\n\t\tNativeView.SetPadding(paddingPx, paddingPx, paddingPx, paddingPx);\n\t}\n\n\tvoid OnPropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)\n\t{\n\t\tif (e.PropertyName == nameof(BackgroundColor))\n\t\t{\n\t\t\tvar drawable = GetOrCreateBorderDrawable();\n\t\t\tif (BackgroundColor != null)\n\t\t\t{\n\t\t\t\tdrawable.SetColor(BackgroundColor.ToAndroidInt());\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdrawable.SetColor(Android.Graphics.Color.Transparent);\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/BoxView.cs",
    "content": "using Android.Content;\n\nnamespace Spice;\n\npublic partial class BoxView\n{\n\t/// <summary>\n\t/// Returns boxView.NativeView\n\t/// </summary>\n\t/// <param name=\"boxView\">The Spice.BoxView</param>\n\tpublic static implicit operator Android.Views.View(BoxView boxView) => boxView.NativeView;\n\n\tstatic Android.Views.View Create(Context context) => new(context);\n\n\t/// <summary>\n\t/// Represents a colored rectangle used for decoration, backgrounds, or dividing lines.\n\t/// Android -> Android.Views.View\n\t/// iOS -> UIKit.UIView\n\t/// </summary>\n\tpublic BoxView() : base(Platform.Context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic BoxView(Context context) : base(context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected BoxView(Func<Context, Android.Views.View> creator) : base(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected BoxView(Context context, Func<Context, Android.Views.View> creator) : base(context, creator) { }\n\n\t/// <summary>\n\t/// The underlying Android.Views.View\n\t/// </summary>\n\tpublic new Android.Views.View NativeView => _nativeView.Value;\n\n\tpartial void OnColorChanged(Color? value) => NativeView.SetBackgroundColor(value.ToAndroidColor());\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/Button.cs",
    "content": "using Android.Content;\n\nnamespace Spice;\n\npublic partial class Button\n{\n\t/// <summary>\n\t/// Returns button.NativeView\n\t/// </summary>\n\t/// <param name=\"button\">The Spice.Button</param>\n\tpublic static implicit operator Android.Widget.Button(Button button) => button.NativeView;\n\n\tstatic Android.Widget.Button Create(Context context) => new(context);\n\n\t/// <summary>\n\t/// You know the button! Use the Clicked event.\n\t/// Android -> Android.Widget.Button\n\t/// iOS -> UIKit.UIButton\n\t/// </summary>\n\tpublic Button() : this(Platform.Context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic Button(Context context) : this(context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected Button(Func<Context, Android.Views.View> creator) : this(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected Button(Context context, Func<Context, Android.Views.View> creator) : base(context, creator) { }\n\n\t/// <summary>\n\t/// The underlying Android.Widget.Button\n\t/// </summary>\n\tpublic new Android.Widget.Button NativeView => (Android.Widget.Button)_nativeView.Value;\n\n\tpartial void OnTextChanged(string value) => NativeView.Text = value;\n\n\tpartial void OnTextColorChanged(Color? value)\n\t{\n\t\tif (value != null)\n\t\t\tNativeView.SetTextColor(Interop.GetDefaultColorStateList(value.ToAndroidInt()));\n\t}\n\n\tEventHandler? _click;\n\n\tpartial void OnClickedChanged(Action<Button>? value)\n\t{\n\t\tif (value == null)\n\t\t{\n\t\t\tif (_click != null)\n\t\t\t{\n\t\t\t\tNativeView.Click -= _click;\n\t\t\t\t_click = null;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (_click != null)\n\t\t\t\tNativeView.Click -= _click;\n\t\t\tNativeView.Click += _click = (sender, e) => Clicked?.Invoke(this);\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/Spice/Platforms/Android/CheckBox.cs",
    "content": "using Android.Content;\nusing Android.Widget;\nusing AndroidCheckBox = Android.Widget.CheckBox;\n\nnamespace Spice;\n\npublic partial class CheckBox\n{\n\t/// <summary>\n\t/// Returns checkBox.NativeView\n\t/// </summary>\n\t/// <param name=\"checkBox\">The Spice.CheckBox</param>\n\tpublic static implicit operator AndroidCheckBox(CheckBox checkBox) => checkBox.NativeView;\n\n\tstatic AndroidCheckBox Create(Context context) => new(context);\n\n\t/// <summary>\n\t/// A checkbox control for boolean selection.\n\t/// Android -> Android.Widget.CheckBox\n\t/// iOS -> UIKit.UIButton (with checkmark styling)\n\t/// </summary>\n\tpublic CheckBox() : this(Platform.Context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic CheckBox(Context context) : this(context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected CheckBox(Func<Context, Android.Views.View> creator) : this(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected CheckBox(Context context, Func<Context, Android.Views.View> creator) : base(context, creator)\n\t{\n\t\t// Always subscribe to keep IsChecked in sync\n\t\tNativeView.CheckedChange += OnCheckedChange;\n\t}\n\n\t/// <summary>\n\t/// The underlying Android.Widget.CheckBox\n\t/// </summary>\n\tpublic new AndroidCheckBox NativeView => (AndroidCheckBox)_nativeView.Value;\n\n\tbool _updatingChecked;\n\n\tpartial void OnIsCheckedChanged(bool value)\n\t{\n\t\tif (_updatingChecked)\n\t\t\treturn;\n\n\t\t_updatingChecked = true;\n\t\tNativeView.Checked = value;\n\t\t_updatingChecked = false;\n\t}\n\n\tvoid OnCheckedChange(object? sender, CompoundButton.CheckedChangeEventArgs e)\n\t{\n\t\tif (_updatingChecked)\n\t\t\treturn;\n\n\t\t_updatingChecked = true;\n\t\tIsChecked = e.IsChecked;\n\t\t_updatingChecked = false;\n\t\tCheckedChanged?.Invoke(this);\n\t}\n\n\tpartial void OnCheckedChangedChanged(Action<CheckBox>? value)\n\t{\n\t\t// Event subscription is handled in constructor\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/CollectionView.cs",
    "content": "using Android.Content;\nusing Android.Views;\nusing AndroidX.RecyclerView.Widget;\nusing System.Collections;\nusing System.Collections.Specialized;\n\nnamespace Spice;\n\npublic partial class CollectionView\n{\n\t/// <summary>\n\t/// Returns collectionView.NativeView\n\t/// </summary>\n\t/// <param name=\"collectionView\">The Spice.CollectionView</param>\n\tpublic static implicit operator RecyclerView(CollectionView collectionView) => collectionView.NativeView;\n\n\tstatic RecyclerView Create(Context context) => new(context);\n\n\t/// <summary>\n\t/// A view for presenting collections of data using a lambda-based item template.\n\t/// Android -> AndroidX.RecyclerView.Widget.RecyclerView\n\t/// iOS -> UIKit.UICollectionView\n\t/// </summary>\n\tpublic CollectionView() : this(Platform.Context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic CollectionView(Context context) : this(context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected CollectionView(Func<Context, Android.Views.View> creator) : this(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected CollectionView(Context context, Func<Context, Android.Views.View> creator) : base(context, creator)\n\t{\n\t\t// Set up RecyclerView\n\t\tvar layoutManager = new LinearLayoutManager(context, LinearLayoutManager.Vertical, false);\n\t\tNativeView.SetLayoutManager(layoutManager);\n\t}\n\n\t/// <summary>\n\t/// The underlying AndroidX.RecyclerView.Widget.RecyclerView\n\t/// </summary>\n\tpublic new RecyclerView NativeView => (RecyclerView)_nativeView.Value;\n\n\tSpiceRecyclerViewAdapter? _adapter;\n\tINotifyCollectionChanged? _observableCollection;\n\n\tpartial void OnItemsSourceChanged(IEnumerable? value)\n\t{\n\t\t// Unsubscribe from old collection\n\t\tif (_observableCollection != null)\n\t\t{\n\t\t\t_observableCollection.CollectionChanged -= OnCollectionChanged;\n\t\t\t_observableCollection = null;\n\t\t}\n\n\t\t// Subscribe to new collection if it's observable\n\t\tif (value is INotifyCollectionChanged observable)\n\t\t{\n\t\t\t_observableCollection = observable;\n\t\t\tobservable.CollectionChanged += OnCollectionChanged;\n\t\t}\n\n\t\tRefreshData();\n\t}\n\n\tpartial void OnItemTemplateChanged(Func<object, View>? value)\n\t{\n\t\tRefreshData();\n\t}\n\n\tpartial void OnOrientationChanged(Orientation value)\n\t{\n\t\tif (!_nativeView.IsValueCreated)\n\t\t\treturn;\n\n\t\tvar layoutManager = NativeView.GetLayoutManager() as LinearLayoutManager;\n\t\tif (layoutManager != null)\n\t\t{\n\t\t\tlayoutManager.Orientation = value == Orientation.Horizontal\n\t\t\t\t? LinearLayoutManager.Horizontal\n\t\t\t\t: LinearLayoutManager.Vertical;\n\t\t}\n\n\t\tRefreshData();\n\t}\n\n\tpartial void OnSelectionModeChanged(SelectionMode value)\n\t{\n\t\t// Selection is handled in the adapter\n\t\tRefreshData();\n\t}\n\n\tpartial void OnSelectedItemChanged(object? value)\n\t{\n\t\tif (_adapter != null)\n\t\t{\n\t\t\t_adapter.NotifyDataSetChanged();\n\t\t}\n\t}\n\n\tpartial void OnItemSpacingChanged(double value)\n\t{\n\t\tif (!_nativeView.IsValueCreated)\n\t\t\treturn;\n\n\t\t// Remove existing decoration\n\t\twhile (NativeView.ItemDecorationCount > 0)\n\t\t{\n\t\t\tNativeView.RemoveItemDecorationAt(0);\n\t\t}\n\n\t\t// Add new decoration with updated spacing\n\t\tif (value > 0)\n\t\t{\n\t\t\tNativeView.AddItemDecoration(new SpaceItemDecoration(value.ToPixels()));\n\t\t}\n\t}\n\n\tvoid OnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)\n\t{\n\t\tRefreshData();\n\t}\n\n\tvoid RefreshData()\n\t{\n\t\tif (!_nativeView.IsValueCreated)\n\t\t\treturn;\n\n\t\tif (_adapter == null)\n\t\t{\n\t\t\t_adapter = new SpiceRecyclerViewAdapter(this);\n\t\t\tNativeView.SetAdapter(_adapter);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t_adapter.UpdateItems(this);\n\t\t\t_adapter.NotifyDataSetChanged();\n\t\t}\n\t}\n\n\tclass SpiceRecyclerViewAdapter : RecyclerView.Adapter\n\t{\n\t\treadonly WeakReference<CollectionView> _parentRef;\n\t\tinternal List<object> _items = new();\n\n\t\tpublic SpiceRecyclerViewAdapter(CollectionView parent)\n\t\t{\n\t\t\t_parentRef = new WeakReference<CollectionView>(parent);\n\t\t\tUpdateItems(parent);\n\t\t}\n\n\t\tpublic void UpdateItems(CollectionView parent)\n\t\t{\n\t\t\t_items.Clear();\n\t\t\tif (parent.ItemsSource != null)\n\t\t\t{\n\t\t\t\tforeach (var item in parent.ItemsSource)\n\t\t\t\t{\n\t\t\t\t\t_items.Add(item);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic override int ItemCount => _items.Count;\n\n\t\tpublic override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)\n\t\t{\n\t\t\tif (!_parentRef.TryGetTarget(out var parent) || parent.ItemTemplate == null)\n\t\t\t\treturn;\n\n\t\t\tvar viewHolder = (SpiceViewHolder)holder;\n\n\t\t\tif (position >= 0 && position < _items.Count)\n\t\t\t{\n\t\t\t\tvar item = _items[position];\n\n\t\t\t\t// Clear existing content\n\t\t\t\tviewHolder.Container.RemoveAllViews();\n\n\t\t\t\t// Create and add the view\n\t\t\t\tvar view = parent.CreateItemView(item);\n\t\t\t\tviewHolder.Container.AddView((Android.Views.View)view);\n\n\t\t\t\t// Handle selection\n\t\t\t\tviewHolder.ItemView.Clickable = parent.SelectionMode != SelectionMode.None;\n\t\t\t\tif (parent.SelectionMode == SelectionMode.Single)\n\t\t\t\t{\n\t\t\t\t\tviewHolder.ItemView.Selected = Equals(item, parent.SelectedItem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)\n\t\t{\n\t\t\tvar container = new Android.Widget.FrameLayout(parent.Context!)\n\t\t\t{\n\t\t\t\tLayoutParameters = new ViewGroup.LayoutParams(\n\t\t\t\t\tViewGroup.LayoutParams.MatchParent,\n\t\t\t\t\tViewGroup.LayoutParams.WrapContent)\n\t\t\t};\n\n\t\t\tvar holder = new SpiceViewHolder(container, _parentRef);\n\t\t\treturn holder;\n\t\t}\n\t}\n\n\tclass SpiceViewHolder : RecyclerView.ViewHolder\n\t{\n\t\treadonly WeakReference<CollectionView> _parentRef;\n\n\t\tpublic Android.Widget.FrameLayout Container { get; }\n\n\t\tpublic SpiceViewHolder(Android.Widget.FrameLayout container, WeakReference<CollectionView> parentRef)\n\t\t\t: base(container)\n\t\t{\n\t\t\tContainer = container;\n\t\t\t_parentRef = parentRef;\n\n\t\t\tItemView.Click += OnItemClick;\n\t\t}\n\n\t\tvoid OnItemClick(object? sender, EventArgs e)\n\t\t{\n\t\t\tif (!_parentRef.TryGetTarget(out var parent))\n\t\t\t\treturn;\n\n\t\t\tif (parent.SelectionMode == SelectionMode.None)\n\t\t\t\treturn;\n\n\t\t\tvar position = BindingAdapterPosition;\n\t\t\tif (position == RecyclerView.NoPosition)\n\t\t\t\treturn;\n\n\t\t\t// Get adapter to access cached items\n\t\t\tvar adapter = ItemView.Parent is RecyclerView recyclerView \n\t\t\t\t? recyclerView.GetAdapter() as SpiceRecyclerViewAdapter \n\t\t\t\t: null;\n\n\t\t\tif (adapter != null && position >= 0 && position < adapter._items.Count)\n\t\t\t{\n\t\t\t\tvar item = adapter._items[position];\n\t\t\t\tif (parent.SelectionMode == SelectionMode.Single)\n\t\t\t\t{\n\t\t\t\t\tparent.SelectedItem = item;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tprotected override void Dispose(bool disposing)\n\t\t{\n\t\t\tif (disposing)\n\t\t\t{\n\t\t\t\tItemView.Click -= OnItemClick;\n\t\t\t}\n\t\t\tbase.Dispose(disposing);\n\t\t}\n\t}\n\n\tclass SpaceItemDecoration : RecyclerView.ItemDecoration\n\t{\n\t\treadonly int _space;\n\n\t\tpublic SpaceItemDecoration(int space)\n\t\t{\n\t\t\t_space = space;\n\t\t}\n\n\t\tpublic override void GetItemOffsets(Android.Graphics.Rect outRect, Android.Views.View view, RecyclerView parent, RecyclerView.State state)\n\t\t{\n\t\t\toutRect.Bottom = _space;\n\n\t\t\t// Add top margin only for the first item\n\t\t\tif (parent.GetChildAdapterPosition(view) == 0)\n\t\t\t{\n\t\t\t\toutRect.Top = _space;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/ContentView.cs",
    "content": "using Android.Content;\n\nnamespace Spice;\n\npublic partial class ContentView\n{\n\t/// <summary>\n\t/// Returns contentView.NativeView\n\t/// </summary>\n\t/// <param name=\"contentView\">The Spice.ContentView</param>\n\tpublic static implicit operator Android.Views.ViewGroup(ContentView contentView) => (Android.Views.ViewGroup)contentView._nativeView.Value;\n\n\tstatic FrameLayout Create(Context context) => new(context);\n\n\t/// <summary>\n\t/// A container view that holds a single child view via the Content property.\n\t/// Android -> Android.Views.ViewGroup (FrameLayout)\n\t/// iOS -> UIKit.UIView\n\t/// </summary>\n\tpublic ContentView() : this(Platform.Context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic ContentView(Context context) : this(context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected ContentView(Func<Context, Android.Views.View> creator) : this(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected ContentView(Context context, Func<Context, Android.Views.View> creator) : base(context, creator) { }\n\n\t/// <summary>\n\t/// The underlying Android.Views.ViewGroup (FrameLayout)\n\t/// </summary>\n\tpublic new Android.Views.ViewGroup NativeView => (Android.Views.ViewGroup)_nativeView.Value;\n\n\tpartial void OnContentChanged(View? oldContent, View? newContent)\n\t{\n\t\t// Remove old content\n\t\tif (oldContent != null)\n\t\t{\n\t\t\tNativeView.RemoveView((Android.Views.View)oldContent);\n\t\t}\n\n\t\t// Add new content\n\t\tif (newContent != null)\n\t\t{\n\t\t\tNativeView.AddView(newContent);\n\t\t}\n\t}\n\n\tpartial void OnPaddingChanged(double value)\n\t{\n\t\tvar paddingPx = value.ToPixels();\n\t\tNativeView.SetPadding(paddingPx, paddingPx, paddingPx, paddingPx);\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/DatePicker.cs",
    "content": "using Android.App;\nusing Android.Content;\nusing Android.Widget;\n\nnamespace Spice;\n\npublic partial class DatePicker\n{\n\t/// <summary>\n\t/// Returns datePicker.NativeView\n\t/// </summary>\n\t/// <param name=\"datePicker\">The Spice.DatePicker</param>\n\tpublic static implicit operator Android.Widget.Button(DatePicker datePicker) => datePicker.NativeView;\n\n\tstatic Android.Widget.Button Create(Context context) => new(context);\n\n\t/// <summary>\n\t/// Control for date selection.\n\t/// Android -> Android.App.DatePickerDialog\n\t/// iOS -> UIKit.UIDatePicker\n\t/// </summary>\n\tpublic DatePicker() : this(Platform.Context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic DatePicker(Context context) : this(context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected DatePicker(Func<Context, Android.Views.View> creator) : this(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected DatePicker(Context context, Func<Context, Android.Views.View> creator) : base(context, creator)\n\t{\n\t\tUpdateText();\n\t\tNativeView.Click += OnClick;\n\t}\n\n\t/// <summary>\n\t/// The underlying Android.Widget.Button\n\t/// </summary>\n\tpublic new Android.Widget.Button NativeView => (Android.Widget.Button)_nativeView.Value;\n\n\tvoid OnClick(object? sender, EventArgs e)\n\t{\n\t\tvar context = NativeView.Context;\n\t\tif (context is not Activity activity)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar dialog = new DatePickerDialog(\n\t\t\tactivity,\n\t\t\t(s, args) =>\n\t\t\t{\n\t\t\t\tDate = new DateTime(args.Year, args.Month + 1, args.DayOfMonth);\n\t\t\t},\n\t\t\tDate.Year,\n\t\t\tDate.Month - 1,\n\t\t\tDate.Day);\n\n\t\tif (MinimumDate.HasValue)\n\t\t{\n\t\t\tdialog.DatePicker.MinDate = new DateTimeOffset(MinimumDate.Value).ToUnixTimeMilliseconds();\n\t\t}\n\n\t\tif (MaximumDate.HasValue)\n\t\t{\n\t\t\tdialog.DatePicker.MaxDate = new DateTimeOffset(MaximumDate.Value).ToUnixTimeMilliseconds();\n\t\t}\n\n\t\tdialog.Show();\n\t}\n\n\tvoid UpdateText()\n\t{\n\t\tNativeView.Text = Date.ToString(\"d\");\n\t}\n\n\tpartial void OnDateChanged(DateTime value)\n\t{\n\t\tUpdateText();\n\t}\n\n\tpartial void OnMinimumDateChanged(DateTime? value)\n\t{\n\t\t// Applied when dialog is shown\n\t}\n\n\tpartial void OnMaximumDateChanged(DateTime? value)\n\t{\n\t\t// Applied when dialog is shown\n\t}\n\n\tpartial void OnTextColorChanged(Color? value)\n\t{\n\t\tif (value != null)\n\t\t\tNativeView.SetTextColor(Interop.GetDefaultColorStateList(value.ToAndroidInt()));\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/Editor.cs",
    "content": "using Android.Content;\nusing Android.Text;\n\nnamespace Spice;\n\npublic partial class Editor\n{\n\t/// <summary>\n\t/// Returns editor.NativeView\n\t/// </summary>\n\t/// <param name=\"editor\">The Spice.Editor</param>\n\tpublic static implicit operator EditText(Editor editor) => editor.NativeView;\n\n\tstatic EditText Create(Context context)\n\t{\n\t\tvar editText = new EditText(context);\n\t\teditText.SetSingleLine(false);\n\t\teditText.InputType = InputTypes.ClassText | InputTypes.TextFlagMultiLine;\n\t\treturn editText;\n\t}\n\n\t/// <summary>\n\t/// Control for multi-line text input.\n\t/// Android -> Android.Widget.EditText (multiline)\n\t/// iOS -> UIKit.UITextView\n\t/// </summary>\n\tpublic Editor() : base(Platform.Context, Create)\n\t{\n\t\tEnsureTextWatcher();\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic Editor(Context context) : base(context, Create)\n\t{\n\t\tEnsureTextWatcher();\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected Editor(Func<Context, Android.Views.View> creator) : base(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected Editor(Context context, Func<Context, Android.Views.View> creator) : base(context, creator) { }\n\n\t/// <summary>\n\t/// The underlying Android.Widget.EditText\n\t/// </summary>\n\tpublic new EditText NativeView => (EditText)_nativeView.Value;\n\n\tpartial void OnTextChanged(string value)\n\t{\n\t\tif (NativeView.Text != value)\n\t\t\tNativeView.Text = value;\n\t}\n\n\tpartial void OnTextColorChanged(Color? value)\n\t{\n\t\tif (value != null)\n\t\t{\n\t\t\tint color = value.ToAndroidInt();\n\t\t\tNativeView.SetTextColor(Interop.GetEditTextColorStateList(color, color));\n\t\t}\n\t}\n\n\tpartial void OnPlaceholderChanged(string? value) => NativeView.Hint = value;\n\n\tpartial void OnPlaceholderColorChanged(Color? value)\n\t{\n\t\tif (value != null)\n\t\t{\n\t\t\tint color = value.ToAndroidInt();\n\t\t\tNativeView.SetHintTextColor(new Android.Content.Res.ColorStateList(\n\t\t\t\tnew[] { Array.Empty<int>() },\n\t\t\t\tnew[] { color }));\n\t\t}\n\t}\n\n\tpartial void OnAutoSizeChanged(bool value)\n\t{\n\t\t// Auto-sizing would require observing content size changes and adjusting height\n\t\t// For minimal implementation, we'll skip this for now\n\t}\n\n\tEditorTextWatcher? _textWatcher;\n\n\tvoid EnsureTextWatcher()\n\t{\n\t\tif (_textWatcher == null)\n\t\t{\n\t\t\t_textWatcher = new EditorTextWatcher(this);\n\t\t\tNativeView.AddTextChangedListener(_textWatcher);\n\t\t}\n\t}\n\n\tclass EditorTextWatcher : Java.Lang.Object, ITextWatcher\n\t{\n\t\treadonly WeakReference<Editor> _editor;\n\n\t\tpublic EditorTextWatcher(Editor editor)\n\t\t{\n\t\t\t_editor = new WeakReference<Editor>(editor);\n\t\t}\n\n\t\tpublic void AfterTextChanged(IEditable? s)\n\t\t{\n\t\t\tif (_editor.TryGetTarget(out var editor))\n\t\t\t{\n\t\t\t\teditor.Text = s?.ToString() ?? \"\";\n\t\t\t}\n\t\t}\n\n\t\tpublic void BeforeTextChanged(Java.Lang.ICharSequence? s, int start, int count, int after) { }\n\n\t\tpublic void OnTextChanged(Java.Lang.ICharSequence? s, int start, int before, int count) { }\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/Entry.cs",
    "content": "﻿using Android.Content;\nusing Android.Text;\n\nnamespace Spice;\n\npublic partial class Entry\n{\n\t/// <summary>\n\t/// Returns entry.NativeView\n\t/// </summary>\n\t/// <param name=\"entry\">The Spice.Entry</param>\n\tpublic static implicit operator EditText(Entry entry) => entry.NativeView;\n\n\tstatic EditText Create(Context context) => new(context);\n\n\t/// <summary>\n\t/// Control for text input, like a form field.\n\t/// Android -> Android.Widget.EditText\n\t/// iOS -> UIKit.UITextField\n\t/// </summary>\n\tpublic Entry() : base(Platform.Context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic Entry(Context context) : base(context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected Entry(Func<Context, Android.Views.View> creator) : base(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected Entry(Context context, Func<Context, Android.Views.View> creator) : base(context, creator) { }\n\n\t/// <summary>\n\t/// The underlying Android.Widget.EditText\n\t/// </summary>\n\tpublic new EditText NativeView => (EditText)_nativeView.Value;\n\n\tpartial void OnTextChanged(string value) => NativeView.Text = value;\n\n\tpartial void OnTextColorChanged(Color? value)\n\t{\n\t\tif (value != null)\n\t\t{\n\t\t\tint color = value.ToAndroidInt();\n\t\t\tNativeView.SetTextColor(Interop.GetEditTextColorStateList(color, color));\n\t\t}\n\t}\n\n\tpartial void OnIsPasswordChanged(bool value) =>\n\t\tNativeView.InputType = value ?\n\t\t\tInputTypes.ClassText | InputTypes.TextVariationPassword :\n\t\t\tInputTypes.ClassText;\n}"
  },
  {
    "path": "src/Spice/Platforms/Android/Grid.cs",
    "content": "using System.Collections.Specialized;\nusing Android.Content;\nusing Android.Widget;\n\nnamespace Spice;\n\npublic partial class Grid\n{\n\t/// <summary>\n\t/// Returns grid.NativeView\n\t/// </summary>\n\t/// <param name=\"grid\">The Spice.Grid</param>\n\tpublic static implicit operator GridLayout(Grid grid) => grid.NativeView;\n\n\tstatic GridLayout Create(Context context) => new(context);\n\n\t/// <summary>\n\t/// A layout container that arranges child views in rows and columns.\n\t/// Android -> Android.Widget.GridLayout\n\t/// </summary>\n\tpublic Grid() : this(Platform.Context, Create)\n\t{\n\t\tNativeView.RowCount = Math.Max(1, RowDefinitions.Count);\n\t\tNativeView.ColumnCount = Math.Max(1, ColumnDefinitions.Count);\n\t\tRowDefinitions.CollectionChanged += OnDefinitionsChanged;\n\t\tColumnDefinitions.CollectionChanged += OnDefinitionsChanged;\n\t\tChildren.CollectionChanged += OnGridChildrenChanged;\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic Grid(Context context) : this(context, Create)\n\t{\n\t\tNativeView.RowCount = Math.Max(1, RowDefinitions.Count);\n\t\tNativeView.ColumnCount = Math.Max(1, ColumnDefinitions.Count);\n\t\tRowDefinitions.CollectionChanged += OnDefinitionsChanged;\n\t\tColumnDefinitions.CollectionChanged += OnDefinitionsChanged;\n\t\tChildren.CollectionChanged += OnGridChildrenChanged;\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected Grid(Func<Context, Android.Views.View> creator) : this(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected Grid(Context context, Func<Context, Android.Views.View> creator) : base(context, creator) { }\n\n\t/// <summary>\n\t/// The underlying Android.Widget.GridLayout\n\t/// </summary>\n\tpublic new GridLayout NativeView => (GridLayout)_nativeView.Value;\n\n\tpartial void OnRowSpacingChanged(double value)\n\t{\n\t\t// Android GridLayout doesn't have direct spacing properties\n\t\t// We need to update the margins on all children\n\t\tUpdateChildMargins();\n\t}\n\n\tpartial void OnColumnSpacingChanged(double value)\n\t{\n\t\t// Android GridLayout doesn't have direct spacing properties\n\t\t// We need to update the margins on all children\n\t\tUpdateChildMargins();\n\t}\n\n\tpartial void OnPaddingChanged(double value)\n\t{\n\t\tvar paddingPx = value.ToPixels();\n\t\tNativeView.SetPadding(paddingPx, paddingPx, paddingPx, paddingPx);\n\t}\n\n\tvoid OnDefinitionsChanged(object? sender, NotifyCollectionChangedEventArgs e)\n\t{\n\t\tNativeView.RowCount = Math.Max(1, RowDefinitions.Count);\n\t\tNativeView.ColumnCount = Math.Max(1, ColumnDefinitions.Count);\n\t\tUpdateLayout();\n\t}\n\n\tvoid OnGridChildrenChanged(object? sender, NotifyCollectionChangedEventArgs e)\n\t{\n\t\tif (e.NewItems != null)\n\t\t{\n\t\t\tforeach (View item in e.NewItems)\n\t\t\t{\n\t\t\t\tConfigureGridChild(item);\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid ConfigureGridChild(View view)\n\t{\n\t\tvar row = GetRow(view);\n\t\tvar column = GetColumn(view);\n\t\tvar rowSpan = GetRowSpan(view);\n\t\tvar columnSpan = GetColumnSpan(view);\n\n\t\t// Calculate actual grid dimensions\n\t\tint maxRow = Math.Max(row + rowSpan - 1, RowDefinitions.Count - 1);\n\t\tint maxColumn = Math.Max(column + columnSpan - 1, ColumnDefinitions.Count - 1);\n\t\t\n\t\t// Also check other children\n\t\tforeach (var child in Children)\n\t\t{\n\t\t\tvar childRow = GetRow(child);\n\t\t\tvar childColumn = GetColumn(child);\n\t\t\tvar childRowSpan = GetRowSpan(child);\n\t\t\tvar childColumnSpan = GetColumnSpan(child);\n\t\t\tmaxRow = Math.Max(maxRow, childRow + childRowSpan - 1);\n\t\t\tmaxColumn = Math.Max(maxColumn, childColumn + childColumnSpan - 1);\n\t\t}\n\n\t\tvar layoutParams = CreateGridLayoutParams(row, column, rowSpan, columnSpan, maxRow, maxColumn);\n\t\t((Android.Views.View)view).LayoutParameters = layoutParams;\n\t}\n\n\tGridLayout.LayoutParams CreateGridLayoutParams(int row, int column, int rowSpan, int columnSpan, int maxRow, int maxColumn)\n\t{\n\t\tvar rowSpec = GridLayout.InvokeSpec(row, rowSpan, GridLayout.Fill);\n\t\tvar columnSpec = GridLayout.InvokeSpec(column, columnSpan, GridLayout.Fill);\n\t\tvar layoutParams = new GridLayout.LayoutParams(rowSpec, columnSpec);\n\n\t\t// Apply row/column definitions sizing\n\t\tif (row < RowDefinitions.Count)\n\t\t{\n\t\t\tvar rowDef = RowDefinitions[row];\n\t\t\tif (rowDef.Height.IsAbsolute)\n\t\t\t{\n\t\t\t\tlayoutParams.Height = (int)rowDef.Height.Value;\n\t\t\t}\n\t\t\telse if (rowDef.Height.IsAuto)\n\t\t\t{\n\t\t\t\tlayoutParams.Height = Android.Views.ViewGroup.LayoutParams.WrapContent;\n\t\t\t}\n\t\t\telse // Star\n\t\t\t{\n\t\t\t\tlayoutParams.Height = 0;\n\t\t\t\tlayoutParams.RowSpec = GridLayout.InvokeSpec(row, rowSpan, GridLayout.Fill, (float)rowDef.Height.Value);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlayoutParams.Height = 0;\n\t\t\tlayoutParams.RowSpec = GridLayout.InvokeSpec(row, rowSpan, GridLayout.Fill, 1f);\n\t\t}\n\n\t\tif (column < ColumnDefinitions.Count)\n\t\t{\n\t\t\tvar colDef = ColumnDefinitions[column];\n\t\t\tif (colDef.Width.IsAbsolute)\n\t\t\t{\n\t\t\t\tlayoutParams.Width = (int)colDef.Width.Value;\n\t\t\t}\n\t\t\telse if (colDef.Width.IsAuto)\n\t\t\t{\n\t\t\t\tlayoutParams.Width = Android.Views.ViewGroup.LayoutParams.WrapContent;\n\t\t\t}\n\t\t\telse // Star\n\t\t\t{\n\t\t\t\tlayoutParams.Width = 0;\n\t\t\t\tlayoutParams.ColumnSpec = GridLayout.InvokeSpec(column, columnSpan, GridLayout.Fill, (float)colDef.Width.Value);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlayoutParams.Width = 0;\n\t\t\tlayoutParams.ColumnSpec = GridLayout.InvokeSpec(column, columnSpan, GridLayout.Fill, 1f);\n\t\t}\n\n\t\t// Apply spacing as margins\n\t\tif (RowSpacing > 0 || ColumnSpacing > 0)\n\t\t{\n\t\t\tvar left = column > 0 ? (int)(ColumnSpacing / 2) : 0;\n\t\t\tvar right = column < maxColumn ? (int)(ColumnSpacing / 2) : 0;\n\t\t\tvar top = row > 0 ? (int)(RowSpacing / 2) : 0;\n\t\t\tvar bottom = row < maxRow ? (int)(RowSpacing / 2) : 0;\n\t\t\tlayoutParams.SetMargins(left, top, right, bottom);\n\t\t}\n\n\t\treturn layoutParams;\n\t}\n\n\tvoid UpdateChildMargins()\n\t{\n\t\t// Calculate actual grid dimensions based on all children\n\t\tint maxRow = 0;\n\t\tint maxColumn = 0;\n\t\t\n\t\tforeach (var child in Children)\n\t\t{\n\t\t\tvar row = GetRow(child);\n\t\t\tvar column = GetColumn(child);\n\t\t\tvar rowSpan = GetRowSpan(child);\n\t\t\tvar columnSpan = GetColumnSpan(child);\n\t\t\tmaxRow = Math.Max(maxRow, row + rowSpan - 1);\n\t\t\tmaxColumn = Math.Max(maxColumn, column + columnSpan - 1);\n\t\t}\n\n\t\t// Update margins on all existing children\n\t\tfor (int i = 0; i < NativeView.ChildCount; i++)\n\t\t{\n\t\t\tvar nativeChild = NativeView.GetChildAt(i);\n\t\t\tif (nativeChild?.LayoutParameters is GridLayout.LayoutParams layoutParams)\n\t\t\t{\n\t\t\t\tvar spiceView = Children.FirstOrDefault(v => ReferenceEquals((Android.Views.View)v, nativeChild));\n\t\t\t\tif (spiceView != null)\n\t\t\t\t{\n\t\t\t\t\tvar row = GetRow(spiceView);\n\t\t\t\t\tvar column = GetColumn(spiceView);\n\n\t\t\t\t\tvar left = column > 0 ? (int)(ColumnSpacing / 2) : 0;\n\t\t\t\t\tvar right = column < maxColumn ? (int)(ColumnSpacing / 2) : 0;\n\t\t\t\t\tvar top = row > 0 ? (int)(RowSpacing / 2) : 0;\n\t\t\t\t\tvar bottom = row < maxRow ? (int)(RowSpacing / 2) : 0;\n\t\t\t\t\tlayoutParams.SetMargins(left, top, right, bottom);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tNativeView.RequestLayout();\n\t}\n\n\tvoid UpdateLayout()\n\t{\n\t\t// Remove all views and re-add with updated parameters\n\t\tvar children = Children.ToList();\n\t\tNativeView.RemoveAllViews();\n\t\tforeach (var child in children)\n\t\t{\n\t\t\tConfigureGridChild(child);\n\t\t\tNativeView.AddView(child);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/Image.cs",
    "content": "﻿using Android.Content;\n\nnamespace Spice;\n\npublic partial class Image\n{\n\t/// <summary>\n\t/// Returns image.NativeView\n\t/// </summary>\n\t/// <param name=\"image\">The Spice.Image</param>\n\tpublic static implicit operator ImageView(Image image) => image.NativeView;\n\n\tstatic ImageView Create(Context context) => new(context);\n\n\t/// <summary>\n\t/// Represents an image on screen. Set the Source property such as \"spice\".\n\t/// Android -> Android.Widget.ImageView\n\t/// iOS -> UIKit.UIImageView\n\t/// </summary>\n\tpublic Image() : this(Platform.Context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic Image(Context context) : this(context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected Image(Func<Context, Android.Views.View> creator) : this(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected Image(Context context, Func<Context, Android.Views.View> creator) : base(context, creator) { }\n\n\t/// <summary>\n\t/// The underlying Android.Widget.ImageView\n\t/// </summary>\n\tpublic new ImageView NativeView => (ImageView)_nativeView.Value;\n\n\tpartial void OnSourceChanged(string value) => Interop.SetImage(NativeView, value);\n}"
  },
  {
    "path": "src/Spice/Platforms/Android/ImageButton.cs",
    "content": "using Android.Content;\n\nnamespace Spice;\n\npublic partial class ImageButton\n{\n\t/// <summary>\n\t/// Returns imageButton.NativeView\n\t/// </summary>\n\t/// <param name=\"imageButton\">The Spice.ImageButton</param>\n\tpublic static implicit operator Android.Widget.ImageButton(ImageButton imageButton) => imageButton.NativeView;\n\n\tstatic Android.Widget.ImageButton Create(Context context) => new(context);\n\n\t/// <summary>\n\t/// A button that displays an image instead of text. Use the Clicked event.\n\t/// Android -> Android.Widget.ImageButton\n\t/// iOS -> UIKit.UIButton\n\t/// </summary>\n\tpublic ImageButton() : this(Platform.Context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic ImageButton(Context context) : this(context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected ImageButton(Func<Context, Android.Views.View> creator) : this(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected ImageButton(Context context, Func<Context, Android.Views.View> creator) : base(context, creator) { }\n\n\t/// <summary>\n\t/// The underlying Android.Widget.ImageButton\n\t/// </summary>\n\tpublic new Android.Widget.ImageButton NativeView => (Android.Widget.ImageButton)_nativeView.Value;\n\n\tpartial void OnSourceChanged(string value)\n\t{\n\t\t// Clear any existing image so invalid/empty sources don't leave a stale image\n\t\tNativeView.SetImageDrawable(null);\n\n\t\tInterop.SetImage(NativeView, value);\n\t}\n\n\tEventHandler? _click;\n\n\tpartial void OnClickedChanged(Action<ImageButton>? value)\n\t{\n\t\t// Always detach any existing handler to avoid multiple subscriptions\n\t\tif (_click != null)\n\t\t{\n\t\t\tNativeView.Click -= _click;\n\t\t\t_click = null;\n\t\t}\n\n\t\t// Attach a new handler only when a non-null delegate is provided\n\t\tif (value != null)\n\t\t{\n\t\t\t_click = (sender, e) => value(this);\n\t\t\tNativeView.Click += _click;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/Interop.java",
    "content": "package spice;\n\nimport android.content.Context;\nimport android.content.res.ColorStateList;\nimport android.widget.ImageView;\n\npublic class Interop {\n\tpublic static void setImage(ImageView image, String value)\n\t{\n\t\tContext context = image.getContext();\n\t\tint id = context.getResources().getIdentifier(value, \"drawable\", context.getPackageName());\n\t\tif (id != 0) {\n\t\t\timage.setImageResource(id);\n\t\t}\n\t}\n\n\t// TODO: @NonNull\n\tpublic static ColorStateList getDefaultColorStateList(int color)\n\t{\n\t\treturn new ColorStateList(ColorStates.DEFAULT, new int[] { color });\n\t}\n\n\t// TODO: @NonNull\n\tpublic static ColorStateList getEditTextColorStateList(int enabled, int disabled)\n\t{\n\t\treturn new ColorStateList(ColorStates.getEditTextState(), new int[] { enabled, disabled });\n\t}\n\n\tprivate static class ColorStates\n\t{\n\t\tstatic final int[] EMPTY = new int[] { };\n\t\tstatic final int[][] DEFAULT = new int[][] { EMPTY };\n\n\t\tstatic int[][] editTextState;\n\n\t\tstatic int[][] getEditTextState()\n\t\t{\n\t\t\tif (editTextState == null) {\n\t\t\t\teditTextState = new int[][] {\n\t\t\t\t\tnew int[] {  android.R.attr.state_enabled },\n\t\t\t\t\tnew int[] { -android.R.attr.state_enabled },\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn editTextState;\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/Spice/Platforms/Android/Label.cs",
    "content": "﻿using Android.Content;\n\nnamespace Spice;\n\npublic partial class Label\n{\n\t/// <summary>\n\t/// Returns label.NativeView\n\t/// </summary>\n\t/// <param name=\"label\">The Spice.Label</param>\n\tpublic static implicit operator TextView(Label label) => label.NativeView;\n\n\tstatic TextView Create(Context context) => new(context);\n\n\t/// <summary>\n\t/// Represents text on screen. Set the Text property to a string value.\n\t/// Android -> Android.Widget.TextView\n\t/// iOS -> UIKit.UILabel\n\t/// </summary>\n\tpublic Label() : base(Platform.Context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic Label(Context context) : base(context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected Label(Func<Context, Android.Views.View> creator) : base(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected Label(Context context, Func<Context, Android.Views.View> creator) : base(context, creator) { }\n\n\t/// <summary>\n\t/// The underlying Android.Widget.TextView\n\t/// </summary>\n\tpublic new TextView NativeView => (TextView)_nativeView.Value;\n\n\tpartial void OnTextChanged(string value) => NativeView.Text = value;\n\n\tpartial void OnTextColorChanged(Color? value)\n\t{\n\t\tif (value != null)\n\t\t\tNativeView.SetTextColor(Interop.GetDefaultColorStateList(value.ToAndroidInt()));\n\t}\n}"
  },
  {
    "path": "src/Spice/Platforms/Android/NavigationView.cs",
    "content": "using Android.Content;\nusing Android.Views;\nusing AndroidX.AppCompat.Widget;\n\nnamespace Spice;\n\npublic partial class NavigationView\n{\n\t/// <summary>\n\t/// NavigationView ctor - creates a container for navigation\n\t/// </summary>\n\tpublic NavigationView() : this(Platform.Context) { }\n\n\t/// <summary>\n\t/// NavigationView ctor\n\t/// </summary>\n\t/// <param name=\"context\">The Android context</param>\n\tpublic NavigationView(Context context) : base(context, ctx => new AndroidX.AppCompat.Widget.LinearLayoutCompat(ctx)\n\t{\n\t\tOrientation = (int)Android.Widget.Orientation.Vertical\n\t})\n\t{\n\t}\n\n\t/// <summary>\n\t/// The underlying LinearLayoutCompat\n\t/// </summary>\n\tpublic new AndroidX.AppCompat.Widget.LinearLayoutCompat NativeView => (AndroidX.AppCompat.Widget.LinearLayoutCompat)_nativeView.Value;\n\n\tAndroidX.AppCompat.Widget.Toolbar? _toolbar;\n\tAndroid.Widget.FrameLayout? _contentFrame;\n\treadonly Stack<View> _backStack = new();\n\n\t/// <summary>\n\t/// Gets or creates the toolbar for navigation\n\t/// </summary>\n\tAndroidX.AppCompat.Widget.Toolbar Toolbar\n\t{\n\t\tget\n\t\t{\n\t\t\tif (_toolbar == null)\n\t\t\t{\n\t\t\t\t_toolbar = new AndroidX.AppCompat.Widget.Toolbar(Platform.Context)\n\t\t\t\t{\n\t\t\t\t\tLayoutParameters = new Android.Widget.LinearLayout.LayoutParams(\n\t\t\t\t\t\tViewGroup.LayoutParams.MatchParent,\n\t\t\t\t\t\tViewGroup.LayoutParams.WrapContent)\n\t\t\t\t};\n\t\t\t\tNativeView.AddView(_toolbar);\n\n\t\t\t\t// Setup back button\n\t\t\t\t_toolbar.NavigationClick += (s, e) => Pop();\n\t\t\t}\n\t\t\treturn _toolbar;\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Gets or creates the content frame\n\t/// </summary>\n\tAndroid.Widget.FrameLayout ContentFrame\n\t{\n\t\tget\n\t\t{\n\t\t\tif (_contentFrame == null)\n\t\t\t{\n\t\t\t\t_contentFrame = new Android.Widget.FrameLayout(Platform.Context)\n\t\t\t\t{\n\t\t\t\t\tLayoutParameters = new Android.Widget.LinearLayout.LayoutParams(\n\t\t\t\t\t\tViewGroup.LayoutParams.MatchParent,\n\t\t\t\t\t\tViewGroup.LayoutParams.MatchParent)\n\t\t\t\t};\n\t\t\t\tNativeView.AddView(_contentFrame);\n\t\t\t}\n\t\t\treturn _contentFrame;\n\t\t}\n\t}\n\n\tpartial void PushCore(View view)\n\t{\n\t\t// Remove current view\n\t\tif (_backStack.Count > 0)\n\t\t{\n\t\t\tContentFrame.RemoveAllViews();\n\t\t}\n\n\t\t// Add new view\n\t\t_backStack.Push(view);\n\t\tContentFrame.AddView(view);\n\n\t\t// Update toolbar\n\t\tToolbar.Title = view.Title;\n\t\t\n\t\t// Show back button if not root\n\t\tif (_backStack.Count > 1)\n\t\t{\n\t\t\tToolbar.NavigationIcon = GetBackIcon();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tToolbar.NavigationIcon = null;\n\t\t}\n\t}\n\n\tpartial void PopCore()\n\t{\n\t\tif (_backStack.Count > 1)\n\t\t{\n\t\t\tvar current = _backStack.Pop();\n\t\t\tContentFrame.RemoveView(current);\n\n\t\t\t// Show previous view\n\t\t\tvar previous = _backStack.Peek();\n\t\t\tContentFrame.AddView(previous);\n\n\t\t\t// Update toolbar\n\t\t\tToolbar.Title = previous.Title;\n\t\t\t\n\t\t\t// Hide back button if back at root\n\t\t\tif (_backStack.Count == 1)\n\t\t\t{\n\t\t\t\tToolbar.NavigationIcon = null;\n\t\t\t}\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Gets the root (bottom of stack)\n\t/// </summary>\n\tpartial void PopToRootCore()\n\t{\n\t\tif (_backStack.Count > 1)\n\t\t{\n\t\t\tvar root = _backStack.Last();\n\t\t\t\n\t\t\t// Clear all but root\n\t\t\tContentFrame.RemoveAllViews();\n\t\t\t_backStack.Clear();\n\t\t\t_backStack.Push(root);\n\n\t\t\t// Show root view\n\t\t\tContentFrame.AddView(root);\n\n\t\t\t// Update toolbar\n\t\t\tToolbar.Title = root.Title;\n\t\t\tToolbar.NavigationIcon = null;\n\t\t}\n\t}\n\n\tAndroid.Graphics.Drawables.Drawable? GetBackIcon()\n\t{\n\t\t// Create a simple back arrow using Material icon if available\n\t\t// Otherwise toolbar will work without an icon\n\t\tvar context = Platform.Context;\n\t\tif (context != null)\n\t\t{\n\t\t\t// Try to get the home as up indicator from AppCompat theme\n\t\t\tvar typedArray = context.Theme?.ObtainStyledAttributes(new int[] { Android.Resource.Attribute.HomeAsUpIndicator });\n\t\t\tif (typedArray != null)\n\t\t\t{\n\t\t\t\tvar drawable = typedArray.GetDrawable(0);\n\t\t\t\ttypedArray.Recycle();\n\t\t\t\treturn drawable;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/Picker.cs",
    "content": "using System.Collections.ObjectModel;\nusing System.Collections.Specialized;\nusing Android.Content;\nusing Android.Widget;\n\nnamespace Spice;\n\npublic partial class Picker\n{\n\t/// <summary>\n\t/// Returns picker.NativeView\n\t/// </summary>\n\t/// <param name=\"picker\">The Spice.Picker</param>\n\tpublic static implicit operator Spinner(Picker picker) => picker.NativeView;\n\n\tstatic Spinner Create(Context context) => new(context);\n\n\t/// <summary>\n\t/// Picker control for selecting an item from a list.\n\t/// Android -> Android.Widget.Spinner\n\t/// iOS -> UIKit.UIPickerView\n\t/// </summary>\n\tpublic Picker() : base(Platform.Context, Create)\n\t{\n\t\tSetupAdapter();\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic Picker(Context context) : base(context, Create)\n\t{\n\t\tSetupAdapter();\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected Picker(Func<Context, Android.Views.View> creator) : base(Platform.Context, creator)\n\t{\n\t\tSetupAdapter();\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected Picker(Context context, Func<Context, Android.Views.View> creator) : base(context, creator)\n\t{\n\t\tSetupAdapter();\n\t}\n\n\t/// <summary>\n\t/// The underlying Android.Widget.Spinner\n\t/// </summary>\n\tpublic new Spinner NativeView => (Spinner)_nativeView.Value;\n\n\tvoid SetupAdapter()\n\t{\n\t\tvar adapter = new ArrayAdapter<string>(NativeView.Context!, Android.Resource.Layout.SimpleSpinnerItem);\n\t\tadapter.SetDropDownViewResource(Android.Resource.Layout.SimpleSpinnerDropDownItem);\n\t\tNativeView.Adapter = adapter;\n\n\t\tNativeView.ItemSelected += OnItemSelected;\n\n\t\t// Subscribe to initial Items collection\n\t\tItems.CollectionChanged += OnItemsCollectionChanged;\n\t}\n\n\tvoid OnItemSelected(object? sender, AdapterView.ItemSelectedEventArgs e)\n\t{\n\t\tif (e.Position != _selectedIndex)\n\t\t{\n\t\t\tSelectedIndex = e.Position;\n\t\t}\n\t}\n\n\tvoid OnItemsCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)\n\t{\n\t\tRefreshAdapter();\n\t}\n\n\tpartial void OnItemsChanged(ObservableCollection<string>? oldValue, ObservableCollection<string> newValue)\n\t{\n\t\tif (oldValue != null)\n\t\t\toldValue.CollectionChanged -= OnItemsCollectionChanged;\n\t\tnewValue.CollectionChanged += OnItemsCollectionChanged;\n\n\t\tRefreshAdapter();\n\t}\n\n\tvoid RefreshAdapter()\n\t{\n\t\tvar adapter = (ArrayAdapter<string>?)NativeView.Adapter;\n\t\tif (adapter != null)\n\t\t{\n\t\t\tadapter.Clear();\n\t\t\tforeach (var item in Items)\n\t\t\t\tadapter.Add(item);\n\t\t\tadapter.NotifyDataSetChanged();\n\n\t\t\t// Clamp selected index: Spinner always has a selection when items exist\n\t\t\tif (Items.Count > 0 && (_selectedIndex < 0 || _selectedIndex >= Items.Count))\n\t\t\t{\n\t\t\t\tSelectedIndex = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\tpartial void OnSelectedIndexChanged(int value)\n\t{\n\t\tif (value >= 0 && value < Items.Count && NativeView.SelectedItemPosition != value)\n\t\t{\n\t\t\tNativeView.SetSelection(value);\n\t\t}\n\t}\n\n\tpartial void OnTitleChanged(string value)\n\t{\n\t\tNativeView.Prompt = value;\n\t}\n\n\tpartial void OnTextColorChanged(Color? value)\n\t{\n\t\t// Text color for Spinner is typically controlled via theme or adapter\n\t\t// For simplicity, we'll skip custom text color on Android Spinner\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/Platform.cs",
    "content": "using Android.Content;\n\nnamespace Spice;\n\nclass Platform\n{\n\tpublic static Context Context { get; set; } = null!;\n}"
  },
  {
    "path": "src/Spice/Platforms/Android/PlatformAppearance.cs",
    "content": "using Android.Content.Res;\n\nnamespace Spice;\n\npublic static partial class PlatformAppearance\n{\n\t/// <summary>\n\t/// Gets whether the system is in dark mode on Android.\n\t/// </summary>\n\tpublic static bool IsDarkMode\n\t{\n\t\tget\n\t\t{\n\t\t\tvar nightMode = Platform.Context.Resources?.Configuration?.UiMode & UiMode.NightMask;\n\t\t\treturn nightMode == UiMode.NightYes;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/PlatformExtensions.cs",
    "content": "﻿namespace Spice;\n\n/// <summary>\n/// Extension methods for Android\n/// </summary>\npublic static class PlatformExtensions\n{\n\tstatic readonly Lazy<float> Density = new(() => Platform.Context.Resources!.DisplayMetrics!.Density);\n\n\t/// <summary>\n\t/// Convert DP to Pixels\n\t/// </summary>\n\t/// <param name=\"value\">DP value</param>\n\t/// <returns>Pixel value</returns>\n\tpublic static int ToPixels(this int value) => (int)Math.Round(value * Density.Value);\n\n\t/// <summary>\n\t/// Convert DP to Pixels\n\t/// </summary>\n\t/// <param name=\"value\">DP value</param>\n\t/// <returns>Pixel value</returns>\n\tpublic static int ToPixels(this double value) => (int)Math.Round(value * Density.Value);\n\n\t/// <summary>\n\t/// Converts a Maui.Graphics.Color to Android int representation of a color\n\t/// </summary>\n\t/// <param name=\"color\">The Maui.Graphics.Color</param>\n\t/// <returns>Android int representation of a color</returns>\n\tpublic static int ToAndroidInt(this Color? color) => color.ToAndroidColor();\n\n\t/// <summary>\n\t/// Converts a Maui.Graphics.Color to Android.Graphics.Color\n\t/// </summary>\n\t/// <param name=\"color\">The Maui.Graphics.Color</param>\n\t/// <returns>The Android.Graphics.Color</returns>\n\tpublic static Android.Graphics.Color ToAndroidColor(this Color? color)\n\t{\n\t\tif (color == null)\n\t\t\treturn Android.Graphics.Color.Transparent;\n\n\t\tint r = (int)Math.Round(color.Red * byte.MaxValue);\n\t\tint g = (int)Math.Round(color.Green * byte.MaxValue);\n\t\tint b = (int)Math.Round(color.Blue * byte.MaxValue);\n\t\tint a = (int)Math.Round(color.Alpha * byte.MaxValue);\n\t\treturn new Android.Graphics.Color(r, g, b, a);\n\t}\n}"
  },
  {
    "path": "src/Spice/Platforms/Android/ProgressBar.cs",
    "content": "using Android.Content;\nusing AndroidProgressBar = Android.Widget.ProgressBar;\n\nnamespace Spice;\n\npublic partial class ProgressBar\n{\n\t/// <summary>\n\t/// Returns progressBar.NativeView\n\t/// </summary>\n\t/// <param name=\"progressBar\">The Spice.ProgressBar</param>\n\tpublic static implicit operator AndroidProgressBar(ProgressBar progressBar) => progressBar.NativeView;\n\n\tstatic AndroidProgressBar Create(Context context)\n\t{\n\t\treturn new AndroidProgressBar(context, null, Android.Resource.Attribute.ProgressBarStyleHorizontal)\n\t\t{\n\t\t\tMax = 10000, // Use a large max for better precision with percentage\n\t\t\tIndeterminate = false\n\t\t};\n\t}\n\n\t/// <summary>\n\t/// Displays a progress indicator showing the completion percentage of a task.\n\t/// Android -> Android.Widget.ProgressBar\n\t/// iOS -> UIKit.UIProgressView\n\t/// </summary>\n\tpublic ProgressBar() : base(Platform.Context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic ProgressBar(Context context) : base(context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected ProgressBar(Func<Context, Android.Views.View> creator) : base(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected ProgressBar(Context context, Func<Context, Android.Views.View> creator) : base(context, creator) { }\n\n\t/// <summary>\n\t/// The underlying Android.Widget.ProgressBar\n\t/// </summary>\n\tpublic new AndroidProgressBar NativeView => (AndroidProgressBar)_nativeView.Value;\n\n\tpartial void OnProgressChanged(double value)\n\t{\n\t\tvar progress = (int)(value * NativeView.Max);\n\t\tNativeView.Progress = progress;\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/RadioButton.cs",
    "content": "using Android.Content;\nusing Android.Widget;\nusing AndroidRadioButton = Android.Widget.RadioButton;\n\nnamespace Spice;\n\npublic partial class RadioButton\n{\n\t/// <summary>\n\t/// Returns radioButton.NativeView\n\t/// </summary>\n\t/// <param name=\"radioButton\">The Spice.RadioButton</param>\n\tpublic static implicit operator AndroidRadioButton(RadioButton radioButton) => radioButton.NativeView;\n\n\tstatic AndroidRadioButton Create(Context context) => new(context);\n\n\t/// <summary>\n\t/// A radio button control for single selection from a group of options.\n\t/// Android -> Android.Widget.RadioButton\n\t/// iOS -> UIKit.UIButton (with circle styling)\n\t/// </summary>\n\tpublic RadioButton() : this(Platform.Context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic RadioButton(Context context) : this(context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected RadioButton(Func<Context, Android.Views.View> creator) : this(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected RadioButton(Context context, Func<Context, Android.Views.View> creator) : base(context, creator)\n\t{\n\t\t// Always subscribe to keep IsChecked in sync\n\t\tNativeView.CheckedChange += OnCheckedChange;\n\t}\n\n\t/// <summary>\n\t/// The underlying Android.Widget.RadioButton\n\t/// </summary>\n\tpublic new AndroidRadioButton NativeView => (AndroidRadioButton)_nativeView.Value;\n\n\tbool _updatingChecked;\n\n\tpartial void OnIsCheckedChangedPartial(bool value)\n\t{\n\t\tif (_updatingChecked)\n\t\t\treturn;\n\n\t\t_updatingChecked = true;\n\t\t// Guard against disposed Java peer (GC can collect during group operations)\n\t\tif (NativeView.Handle != IntPtr.Zero)\n\t\t\tNativeView.Checked = value;\n\t\t_updatingChecked = false;\n\t}\n\n\tpartial void OnContentChanged(string? value)\n\t{\n\t\tNativeView.Text = value;\n\t}\n\n\tvoid OnCheckedChange(object? sender, CompoundButton.CheckedChangeEventArgs e)\n\t{\n\t\tif (_updatingChecked)\n\t\t\treturn;\n\n\t\t// Prevent unchecking via user tap - radio buttons can only be unchecked by another button in the group\n\t\tif (!e.IsChecked && IsChecked)\n\t\t{\n\t\t\t_updatingChecked = true;\n\t\t\tNativeView.Checked = true;\n\t\t\t_updatingChecked = false;\n\t\t\treturn;\n\t\t}\n\n\t\t// Only fire CheckedChanged if the state actually changes\n\t\tbool stateChanged = IsChecked != e.IsChecked;\n\n\t\t_updatingChecked = true;\n\t\tIsChecked = e.IsChecked;\n\t\t_updatingChecked = false;\n\n\t\t// Fire CheckedChanged only when state changes (not when tapping already-checked button)\n\t\tif (stateChanged)\n\t\t{\n\t\t\tCheckedChanged?.Invoke(this);\n\t\t}\n\t}\n\n\tpartial void OnCheckedChangedChanged(Action<RadioButton>? value)\n\t{\n\t\t// Event subscription is handled in constructor\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/RefreshView.cs",
    "content": "using Android.Content;\nusing AndroidX.SwipeRefreshLayout.Widget;\n\nnamespace Spice;\n\npublic partial class RefreshView\n{\n\t/// <summary>\n\t/// Returns refreshView.NativeView\n\t/// </summary>\n\t/// <param name=\"refreshView\">The Spice.RefreshView</param>\n\tpublic static implicit operator SwipeRefreshLayout(RefreshView refreshView) => refreshView.NativeView;\n\n\tstatic SwipeRefreshLayout Create(Context context)\n\t{\n\t\tvar swipeRefresh = new SwipeRefreshLayout(context);\n\t\treturn swipeRefresh;\n\t}\n\n\t/// <summary>\n\t/// A container view that provides pull-to-refresh functionality for scrollable content.\n\t/// Wrap a scrollable view (such as ScrollView, ListView, or CollectionView) to enable pull-to-refresh.\n\t/// Android -> AndroidX.SwipeRefreshLayout.Widget.SwipeRefreshLayout\n\t/// iOS -> UIKit.UIView with UIRefreshControl attached to child scroll view\n\t/// </summary>\n\tpublic RefreshView() : this(Platform.Context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic RefreshView(Context context) : this(context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected RefreshView(Func<Context, Android.Views.View> creator) : this(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected RefreshView(Context context, Func<Context, Android.Views.View> creator) : base(context, creator)\n\t{\n\t\t// Set up the refresh listener\n\t\tNativeView.Refresh += OnRefresh;\n\t}\n\n\t/// <summary>\n\t/// The underlying AndroidX.SwipeRefreshLayout.Widget.SwipeRefreshLayout\n\t/// </summary>\n\tpublic new SwipeRefreshLayout NativeView => (SwipeRefreshLayout)_nativeView.Value;\n\n\tvoid OnRefresh(object? sender, EventArgs e)\n\t{\n\t\t// Trigger command if set\n\t\tCommand?.Invoke();\n\t\t\n\t\t// Update IsRefreshing to true when user pulls to refresh\n\t\t// The user should set IsRefreshing = false when refresh completes\n\t\tif (!IsRefreshing)\n\t\t{\n\t\t\tIsRefreshing = true;\n\t\t}\n\t}\n\n\tpartial void OnContentChanged(View? oldContent, View? newContent)\n\t{\n\t\t// Remove old content\n\t\tif (oldContent != null)\n\t\t{\n\t\t\tNativeView.RemoveView((Android.Views.View)oldContent);\n\t\t}\n\n\t\t// Add new content\n\t\tif (newContent != null)\n\t\t{\n\t\t\tNativeView.AddView(newContent);\n\t\t}\n\t}\n\n\tpartial void OnIsRefreshingChanged(bool value)\n\t{\n\t\tNativeView.Refreshing = value;\n\t}\n\n\tpartial void OnRefreshColorChanged(Color? value)\n\t{\n\t\tif (value != null)\n\t\t{\n\t\t\tNativeView.SetColorSchemeColors(value.ToAndroidInt());\n\t\t}\n\t}\n\n\tpartial void OnPaddingChanged(double value)\n\t{\n\t\tvar paddingPx = value.ToPixels();\n\t\tNativeView.SetPadding(paddingPx, paddingPx, paddingPx, paddingPx);\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/ScrollView.cs",
    "content": "using Android.Content;\n\nnamespace Spice;\n\npublic partial class ScrollView\n{\n\t/// <summary>\n\t/// Returns scrollView.NativeView\n\t/// </summary>\n\t/// <param name=\"scrollView\">The Spice.ScrollView</param>\n\tpublic static implicit operator Android.Views.ViewGroup(ScrollView scrollView) => (Android.Views.ViewGroup)scrollView._nativeView.Value;\n\n\tstatic Android.Views.View CreateVertical(Context context) => new Android.Widget.ScrollView(context);\n\n\tstatic Android.Views.View CreateHorizontal(Context context) => new HorizontalScrollView(context);\n\n\tstatic Func<Context, Android.Views.View> GetCreator(Orientation orientation) =>\n\t\torientation == Orientation.Horizontal ? CreateHorizontal : CreateVertical;\n\n\t/// <summary>\n\t/// A scrollable container view that can hold a single child view.\n\t/// Android -> Android.Widget.ScrollView (vertical) / Android.Widget.HorizontalScrollView (horizontal)\n\t/// iOS -> UIKit.UIScrollView\n\t/// </summary>\n\tpublic ScrollView() : this(Platform.Context, Orientation.Vertical) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"orientation\">The scroll orientation. Must be set at construction time on Android.</param>\n\tpublic ScrollView(Orientation orientation) : this(Platform.Context, orientation) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic ScrollView(Context context) : this(context, Orientation.Vertical) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"orientation\">The scroll orientation. Must be set at construction time on Android.</param>\n\tprotected ScrollView(Context context, Orientation orientation) : base(context, GetCreator(orientation))\n\t{\n\t\t_orientation = orientation;\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected ScrollView(Func<Context, Android.Views.View> creator) : this(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected ScrollView(Context context, Func<Context, Android.Views.View> creator) : base(context, creator) { }\n\n\t/// <summary>\n\t/// The underlying Android.Widget.ScrollView (or HorizontalScrollView)\n\t/// </summary>\n\tpublic new Android.Views.ViewGroup NativeView => (Android.Views.ViewGroup)_nativeView.Value;\n\n\tpartial void OnOrientationChanging(Orientation value)\n\t{\n\t\t// Android has separate ScrollView (vertical) and HorizontalScrollView classes.\n\t\t// Use the ScrollView(Orientation) constructor to set orientation at creation time.\n\t\tthrow new NotSupportedException(\n\t\t\t\"Changing ScrollView orientation is not supported on Android. \" +\n\t\t\t\"Use the ScrollView(Orientation) constructor instead.\");\n\t}\n\n\tpartial void OnPaddingChanged(double value)\n\t{\n\t\tvar paddingPx = value.ToPixels();\n\t\tNativeView.SetPadding(paddingPx, paddingPx, paddingPx, paddingPx);\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/SearchBar.cs",
    "content": "﻿using Android.Content;\n\nnamespace Spice;\n\npublic partial class SearchBar\n{\n\t/// <summary>\n\t/// Returns searchBar.NativeView\n\t/// </summary>\n\t/// <param name=\"searchBar\">The Spice.SearchBar</param>\n\tpublic static implicit operator SearchView(SearchBar searchBar) => searchBar.NativeView;\n\n\tstatic SearchView Create(Context context) => new(context) { Iconified = false };\n\n\t/// <summary>\n\t/// Control for search input with a search button.\n\t/// Android -> Android.Widget.SearchView\n\t/// iOS -> UIKit.UISearchBar\n\t/// </summary>\n\tpublic SearchBar() : base(Platform.Context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic SearchBar(Context context) : base(context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected SearchBar(Func<Context, Android.Views.View> creator) : base(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected SearchBar(Context context, Func<Context, Android.Views.View> creator) : base(context, creator) { }\n\n\t/// <summary>\n\t/// The underlying Android.Widget.SearchView\n\t/// </summary>\n\tpublic new SearchView NativeView => (SearchView)_nativeView.Value;\n\n\tpartial void OnTextChanged(string value)\n\t{\n\t\tif (NativeView.Query != value)\n\t\t\tNativeView.SetQuery(value, false);\n\t}\n\n\tpartial void OnPlaceholderChanged(string? value) => NativeView.SetQueryHint(value);\n\n\tpartial void OnTextColorChanged(Color? value)\n\t{\n\t\t// SearchView text color is set via the internal EditText\n\t\tvar editTextId = NativeView.Context?.Resources?.GetIdentifier(\"android:id/search_src_text\", null, null) ?? 0;\n\t\tif (editTextId != 0)\n\t\t{\n\t\t\tvar editText = NativeView.FindViewById<Android.Widget.EditText>(editTextId);\n\t\t\tif (editText != null && value != null)\n\t\t\t{\n\t\t\t\tint color = value.ToAndroidInt();\n\t\t\t\teditText.SetTextColor(Interop.GetEditTextColorStateList(color, color));\n\t\t\t}\n\t\t}\n\t}\n\n\tpartial void OnPlaceholderColorChanged(Color? value)\n\t{\n\t\t// SearchView hint color is set via the internal EditText\n\t\tvar editTextId = NativeView.Context?.Resources?.GetIdentifier(\"android:id/search_src_text\", null, null) ?? 0;\n\t\tif (editTextId != 0)\n\t\t{\n\t\t\tvar editText = NativeView.FindViewById<Android.Widget.EditText>(editTextId);\n\t\t\tif (editText != null && value != null)\n\t\t\t{\n\t\t\t\tint color = value.ToAndroidInt();\n\t\t\t\teditText.SetHintTextColor(new Android.Content.Res.ColorStateList(\n\t\t\t\t\tnew[] { Array.Empty<int>() },\n\t\t\t\t\tnew[] { color }));\n\t\t\t}\n\t\t}\n\t}\n\n\tSearchView.IOnQueryTextListener? _queryTextListener;\n\n\tvoid UpdateQueryTextListener()\n\t{\n\t\tif (SearchButtonPressed == null && TextChanged == null)\n\t\t{\n\t\t\tNativeView.SetOnQueryTextListener(null);\n\t\t\t_queryTextListener = null;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (_queryTextListener == null)\n\t\t\t{\n\t\t\t\t_queryTextListener = new QueryTextListener(this);\n\t\t\t\tNativeView.SetOnQueryTextListener(_queryTextListener);\n\t\t\t}\n\t\t}\n\t}\n\n\tpartial void OnSearchButtonPressedChanged(Action<SearchBar>? value) => UpdateQueryTextListener();\n\n\tpartial void OnTextChangedChanged(Action<SearchBar>? value) => UpdateQueryTextListener();\n\n\tclass QueryTextListener : Java.Lang.Object, SearchView.IOnQueryTextListener\n\t{\n\t\treadonly WeakReference<SearchBar> _searchBar;\n\n\t\tpublic QueryTextListener(SearchBar searchBar)\n\t\t{\n\t\t\t_searchBar = new WeakReference<SearchBar>(searchBar);\n\t\t}\n\n\t\tpublic bool OnQueryTextSubmit(string? query)\n\t\t{\n\t\t\tif (_searchBar.TryGetTarget(out var searchBar))\n\t\t\t{\n\t\t\t\tsearchBar.Text = query ?? \"\";\n\t\t\t\tsearchBar.SearchButtonPressed?.Invoke(searchBar);\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tpublic bool OnQueryTextChange(string? newText)\n\t\t{\n\t\t\tif (_searchBar.TryGetTarget(out var searchBar))\n\t\t\t{\n\t\t\t\tsearchBar.Text = newText ?? \"\";\n\t\t\t\tsearchBar.TextChanged?.Invoke(searchBar);\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/Slider.cs",
    "content": "using Android.Content;\nusing Android.Widget;\n\nnamespace Spice;\n\npublic partial class Slider\n{\n\t/// <summary>\n\t/// Returns slider.NativeView\n\t/// </summary>\n\t/// <param name=\"slider\">The Spice.Slider</param>\n\tpublic static implicit operator SeekBar(Slider slider) => slider.NativeView;\n\n\tstatic SeekBar Create(Context context) => new(context);\n\n\t/// <summary>\n\t/// A slider control for selecting a numeric value from a range.\n\t/// Android -> Android.Widget.SeekBar\n\t/// iOS -> UIKit.UISlider\n\t/// </summary>\n\tpublic Slider() : this(Platform.Context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic Slider(Context context) : this(context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected Slider(Func<Context, Android.Views.View> creator) : this(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected Slider(Context context, Func<Context, Android.Views.View> creator) : base(context, creator) { }\n\n\t/// <summary>\n\t/// The underlying Android.Widget.SeekBar\n\t/// </summary>\n\tpublic new SeekBar NativeView => (SeekBar)_nativeView.Value;\n\n\tpartial void OnMinimumChanged(double value)\n\t{\n\t\tNativeView.Min = (int)value;\n\t\t// Re-apply value in case it's now out of range\n\t\tNativeView.Progress = (int)Value;\n\t}\n\n\tpartial void OnMaximumChanged(double value)\n\t{\n\t\tNativeView.Max = (int)value;\n\t\t// Re-apply value in case it's now out of range\n\t\tNativeView.Progress = (int)Value;\n\t}\n\n\tpartial void OnValueChanged(double value)\n\t{\n\t\tint intValue = (int)value;\n\t\tif (NativeView.Progress != intValue)\n\t\t{\n\t\t\tNativeView.Progress = intValue;\n\t\t}\n\t}\n\n\tSeekBarChangeListener? _listener;\n\n\tpartial void OnValueChangedChanged(Action<Slider>? value)\n\t{\n\t\tif (value == null)\n\t\t{\n\t\t\tif (_listener != null)\n\t\t\t{\n\t\t\t\tNativeView.SetOnSeekBarChangeListener(null);\n\t\t\t\t_listener = null;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t_listener = new SeekBarChangeListener(this);\n\t\t\tNativeView.SetOnSeekBarChangeListener(_listener);\n\t\t}\n\t}\n\n\tclass SeekBarChangeListener : Java.Lang.Object, SeekBar.IOnSeekBarChangeListener\n\t{\n\t\treadonly Slider _slider;\n\n\t\tpublic SeekBarChangeListener(Slider slider)\n\t\t{\n\t\t\t_slider = slider;\n\t\t}\n\n\t\tpublic void OnProgressChanged(SeekBar? seekBar, int progress, bool fromUser)\n\t\t{\n\t\t\t_slider.Value = progress;\n\t\t\t_slider.ValueChanged?.Invoke(_slider);\n\t\t}\n\n\t\tpublic void OnStartTrackingTouch(SeekBar? seekBar) { }\n\n\t\tpublic void OnStopTrackingTouch(SeekBar? seekBar) { }\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/SpiceActivity.cs",
    "content": "﻿using Android.Content.Res;\nusing AndroidX.AppCompat.App;\n\nnamespace Spice;\n\n/// <summary>\n/// The SpiceActivity to use in Android applications.\n/// OnCreate() sets Platform.Context = this.\n/// </summary>\npublic class SpiceActivity : AppCompatActivity\n{\n\t/// <summary>\n\t/// The app view that was set using SetContentView\n\t/// </summary>\n\tprivate View? _appView;\n\n\t/// <inheritdoc />\n\tprotected override void OnCreate(Bundle? savedInstanceState)\n\t{\n\t\tPlatform.Context = this;\n\n\t\tbase.OnCreate(savedInstanceState);\n\t}\n\n\t/// <summary>\n\t/// Sets the content view to a Spice View and stores a reference for disposal.\n\t/// This method accepts a <see cref=\"Spice.View\"/> rather than <see cref=\"Android.Views.View\"/>,\n\t/// providing a convenient way to set Spice views as content while ensuring proper lifecycle management.\n\t/// The view will be automatically disposed when the activity is destroyed.\n\t/// </summary>\n\t/// <param name=\"view\">The Spice view to set as content</param>\n\tpublic void SetContentView(View view)\n\t{\n\t\t_appView = view;\n\t\tbase.SetContentView((Android.Views.View)view);\n\t}\n\n\t/// <inheritdoc />\n\tpublic override void OnConfigurationChanged(Configuration newConfig)\n\t{\n\t\tbase.OnConfigurationChanged(newConfig);\n\n\t\tvar nightMode = newConfig.UiMode & UiMode.NightMask;\n\t\tPlatformAppearance.OnChanged(nightMode == UiMode.NightYes);\n\t}\n\n\t/// <inheritdoc />\n\tprotected override void OnDestroy()\n\t{\n\t\t// Dispose the app view and all its children\n\t\tif (_appView != null)\n\t\t{\n\t\t\tView.DisposeRecursive(_appView);\n\t\t\t_appView = null;\n\t\t}\n\n\t\tbase.OnDestroy();\n\t}\n}"
  },
  {
    "path": "src/Spice/Platforms/Android/StackLayout.cs",
    "content": "﻿using Android.Content;\n\nnamespace Spice;\n\npublic partial class StackLayout\n{\n\t/// <summary>\n\t/// Returns stackLayout.NativeView\n\t/// </summary>\n\t/// <param name=\"stackLayout\">The Spice.StackLayout</param>\n\tpublic static implicit operator LinearLayout(StackLayout stackLayout) => stackLayout.NativeView;\n\n\tstatic LinearLayout Create(Context context)\n\t{\n\t\tvar layout = new LinearLayout(context)\n\t\t{\n\t\t\tOrientation = Android.Widget.Orientation.Vertical,\n\t\t};\n\t\tlayout.SetGravity(Android.Views.GravityFlags.Center);\n\t\treturn layout;\n\t}\n\n\t/// <summary>\n\t/// A parent view for laying out child controls in a row. Defaults to Orientation=Vertical.\n\t/// Android -> Android.Widget.LinearLayout\n\t/// iOS -> UIKit.UIStackView\n\t/// </summary>\n\tpublic StackLayout() : this(Platform.Context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic StackLayout(Context context) : this(context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected StackLayout(Func<Context, Android.Views.View> creator) : this(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected StackLayout(Context context, Func<Context, Android.Views.View> creator) : base(context, creator) { }\n\n\t/// <summary>\n\t/// The underlying Android.Widget.LinearLayout\n\t/// </summary>\n\tpublic new LinearLayout NativeView => (LinearLayout)_nativeView.Value;\n\n\tpartial void OnOrientationChanging(Orientation value)\n\t{\n\t\tswitch (value)\n\t\t{\n\t\t\tcase Orientation.Vertical:\n\t\t\t\tNativeView.Orientation = Android.Widget.Orientation.Vertical;\n\t\t\t\tbreak;\n\t\t\tcase Orientation.Horizontal:\n\t\t\t\tNativeView.Orientation = Android.Widget.Orientation.Horizontal;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new NotSupportedException($\"{nameof(Orientation)} value '{value}' not supported!\");\n\t\t}\n\t}\n\n\tpartial void OnSpacingChanged(double value) => NativeView.DividerPadding = (int)value;\n\n\tpartial void OnPaddingChanged(double value)\n\t{\n\t\tvar paddingPx = value.ToPixels();\n\t\tNativeView.SetPadding(paddingPx, paddingPx, paddingPx, paddingPx);\n\t}\n}"
  },
  {
    "path": "src/Spice/Platforms/Android/SwipeView.cs",
    "content": "using Android.Content;\nusing Android.Views;\nusing Android.Widget;\n\nnamespace Spice;\n\npublic partial class SwipeView\n{\n\t/// <summary>\n\t/// Returns swipeView.NativeView\n\t/// </summary>\n\t/// <param name=\"swipeView\">The Spice.SwipeView</param>\n\tpublic static implicit operator Android.Views.ViewGroup(SwipeView swipeView) => (Android.Views.ViewGroup)swipeView._nativeView.Value;\n\n\tstatic FrameLayout Create(Context context) => new(context);\n\n\t/// <summary>\n\t/// A container control that wraps around an item of content and provides context menu items \n\t/// that are revealed by a swipe gesture.\n\t/// Android -> Custom view with gesture detection\n\t/// </summary>\n\tpublic SwipeView() : this(Platform.Context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic SwipeView(Context context) : this(context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected SwipeView(Func<Context, Android.Views.View> creator) : this(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected SwipeView(Context context, Func<Context, Android.Views.View> creator) : base(context, creator)\n\t{\n\t\tSetupGestureDetector();\n\t}\n\n\t/// <summary>\n\t/// The underlying Android.Views.ViewGroup (FrameLayout)\n\t/// </summary>\n\tpublic new Android.Views.ViewGroup NativeView => (Android.Views.ViewGroup)_nativeView.Value;\n\n\tGestureDetector? _gestureDetector;\n\tAndroid.Views.View? _contentView;\n\tLinearLayout? _swipeItemsLayout;\n\tSwipeDirection? _currentSwipeDirection;\n\tfloat _startX;\n\tfloat _startY;\n\n\tvoid SetupGestureDetector()\n\t{\n\t\tvar listener = new SwipeGestureListener(this);\n\t\t_gestureDetector = new GestureDetector(NativeView.Context, listener);\n\n\t\tNativeView.Touch += (sender, e) =>\n\t\t{\n\t\t\tif (e.Event != null) _gestureDetector?.OnTouchEvent(e.Event);\n\n\t\t\tif (e.Event?.Action == MotionEventActions.Up || e.Event?.Action == MotionEventActions.Cancel)\n\t\t\t{\n\t\t\t\tHandleTouchEnd(e.Event);\n\t\t\t}\n\t\t};\n\t}\n\n\tclass SwipeGestureListener : GestureDetector.SimpleOnGestureListener\n\t{\n\t\treadonly SwipeView _swipeView;\n\n\t\tpublic SwipeGestureListener(SwipeView swipeView)\n\t\t{\n\t\t\t_swipeView = swipeView;\n\t\t}\n\n\t\tpublic override bool OnDown(MotionEvent? e)\n\t\t{\n\t\t\tif (e != null)\n\t\t\t{\n\t\t\t\t_swipeView._startX = e.GetX();\n\t\t\t\t_swipeView._startY = e.GetY();\n\t\t\t\t_swipeView._currentSwipeDirection = null;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tpublic override bool OnScroll(MotionEvent? e1, MotionEvent? e2, float distanceX, float distanceY)\n\t\t{\n\t\t\tif (e2 == null || _swipeView._contentView == null)\n\t\t\t\treturn false;\n\n\t\t\tvar deltaX = e2.GetX() - _swipeView._startX;\n\t\t\tvar deltaY = e2.GetY() - _swipeView._startY;\n\n\t\t\t// Determine swipe direction\n\t\t\tSwipeDirection? direction = null;\n\t\t\tif (Math.Abs(deltaX) > Math.Abs(deltaY))\n\t\t\t{\n\t\t\t\tdirection = deltaX > 0 ? SwipeDirection.Right : SwipeDirection.Left;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdirection = deltaY > 0 ? SwipeDirection.Down : SwipeDirection.Up;\n\t\t\t}\n\n\t\t\t// Only handle horizontal swipes for now\n\t\t\tif (direction == SwipeDirection.Left || direction == SwipeDirection.Right)\n\t\t\t{\n\t\t\t\tif (_swipeView._currentSwipeDirection == null)\n\t\t\t\t{\n\t\t\t\t\t_swipeView._currentSwipeDirection = direction;\n\t\t\t\t\t_swipeView.SwipeStarted?.Invoke(_swipeView, direction.Value);\n\t\t\t\t}\n\n\t\t\t\t// Update content view position\n\t\t\t\t_swipeView._contentView.TranslationX = deltaX;\n\t\t\t\t_swipeView.SwipeChanging?.Invoke(_swipeView, direction.Value, Math.Abs(deltaX));\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tvoid HandleTouchEnd(MotionEvent? e)\n\t{\n\t\tif (_currentSwipeDirection == null || _contentView == null)\n\t\t\treturn;\n\n\t\tvar deltaX = e != null ? e.GetX() - _startX : 0;\n\t\tvar thresholdDp = Threshold > 0 ? Threshold : 150; // dp\n\t\tvar thresholdPx = thresholdDp.ToPixels();\n\t\tvar isOpen = Math.Abs(deltaX) > thresholdPx;\n\n\t\tif (isOpen && _currentSwipeDirection == SwipeDirection.Left && RightItems != null)\n\t\t{\n\t\t\tShowSwipeItems(RightItems, SwipeDirection.Left);\n\t\t}\n\t\telse if (isOpen && _currentSwipeDirection == SwipeDirection.Right && LeftItems != null)\n\t\t{\n\t\t\tShowSwipeItems(LeftItems, SwipeDirection.Right);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tResetPosition();\n\t\t}\n\n\t\tSwipeEnded?.Invoke(this, _currentSwipeDirection.Value, isOpen);\n\t\t_currentSwipeDirection = null;\n\t}\n\n\tvoid ShowSwipeItems(SwipeItems items, SwipeDirection direction)\n\t{\n\t\tif (_contentView == null)\n\t\t\treturn;\n\n\t\t// Clean up existing swipe items layout\n\t\tif (_swipeItemsLayout != null)\n\t\t\tNativeView.RemoveView(_swipeItemsLayout);\n\n\t\t// Create swipe items container\n\t\t_swipeItemsLayout = new LinearLayout(NativeView.Context!)\n\t\t{\n\t\t\tOrientation = Android.Widget.Orientation.Horizontal,\n\t\t\tLayoutParameters = new FrameLayout.LayoutParams(\n\t\t\t\tAndroid.Views.ViewGroup.LayoutParams.WrapContent,\n\t\t\t\tAndroid.Views.ViewGroup.LayoutParams.MatchParent)\n\t\t};\n\n\t\tforeach (var item in items.Items)\n\t\t{\n\t\t\tif (!item.IsVisible)\n\t\t\t\tcontinue;\n\n\t\t\tvar buttonWidthPx = 75.ToPixels(); // 75dp converted to pixels\n\t\t\tvar button = new Android.Widget.Button(NativeView.Context!)\n\t\t\t{\n\t\t\t\tText = item.Text ?? \"\",\n\t\t\t\tLayoutParameters = new LinearLayout.LayoutParams(buttonWidthPx, Android.Views.ViewGroup.LayoutParams.MatchParent)\n\t\t\t};\n\n\t\t\tif (item.BackgroundColor != null)\n\t\t\t{\n\t\t\t\tbutton.SetBackgroundColor(item.BackgroundColor.ToAndroidColor());\n\t\t\t}\n\n\t\t\t// Capture item reference for the closure\n\t\t\tvar swipeItem = item;\n\t\t\tbutton.Click += (s, e) =>\n\t\t\t{\n\t\t\t\tswipeItem.Invoked?.Invoke(swipeItem);\n\n\t\t\t\tif (items.SwipeBehaviorOnInvoked == SwipeBehaviorOnInvoked.Close ||\n\t\t\t\t\titems.SwipeBehaviorOnInvoked == SwipeBehaviorOnInvoked.Auto)\n\t\t\t\t{\n\t\t\t\t\tClose();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t_swipeItemsLayout.AddView(button);\n\t\t}\n\n\t\t// Position swipe items layout\n\t\tvar layoutParams = (FrameLayout.LayoutParams?)_swipeItemsLayout.LayoutParameters;\n\t\tif (layoutParams != null)\n\t\t{\n\t\t\tlayoutParams.Gravity = direction == SwipeDirection.Left ? GravityFlags.End : GravityFlags.Start;\n\t\t}\n\n\t\tNativeView.AddView(_swipeItemsLayout, 0);\n\n\t\t// Animate content view to reveal swipe items\n\t\t_swipeItemsLayout.Measure(\n\t\t\tAndroid.Views.View.MeasureSpec.MakeMeasureSpec(0, MeasureSpecMode.Unspecified),\n\t\t\tAndroid.Views.View.MeasureSpec.MakeMeasureSpec(0, MeasureSpecMode.Unspecified));\n\t\tvar itemsWidth = _swipeItemsLayout.MeasuredWidth;\n\n\t\t_contentView?.Animate()\n\t\t\t?.TranslationX(direction == SwipeDirection.Left ? -itemsWidth : itemsWidth)\n\t\t\t?.SetDuration(300)\n\t\t\t?.Start();\n\t}\n\n\tvoid ResetPosition()\n\t{\n\t\tif (_contentView == null)\n\t\t\treturn;\n\n\t\t_contentView.Animate()\n\t\t\t?.TranslationX(0)\n\t\t\t?.SetDuration(300)\n\t\t\t?.WithEndAction(new Java.Lang.Runnable(() =>\n\t\t\t{\n\t\t\t\tif (_swipeItemsLayout != null)\n\t\t\t\t\tNativeView.RemoveView(_swipeItemsLayout);\n\t\t\t\t_swipeItemsLayout = null;\n\t\t\t}))\n\t\t\t?.Start();\n\t}\n\n\tpartial void OnContentChanged(View? oldContent, View? newContent)\n\t{\n\t\t// Remove old content\n\t\tif (oldContent != null)\n\t\t{\n\t\t\tNativeView.RemoveView((Android.Views.View)oldContent);\n\t\t}\n\n\t\tif (_contentView != null)\n\t\t\tNativeView.RemoveView(_contentView);\n\n\t\t// Add new content\n\t\tif (newContent != null)\n\t\t{\n\t\t\t_contentView = new FrameLayout(NativeView.Context!)\n\t\t\t{\n\t\t\t\tLayoutParameters = new FrameLayout.LayoutParams(\n\t\t\t\t\tAndroid.Views.ViewGroup.LayoutParams.MatchParent,\n\t\t\t\t\tAndroid.Views.ViewGroup.LayoutParams.MatchParent)\n\t\t\t};\n\t\t\t((Android.Views.ViewGroup)_contentView).AddView(newContent);\n\t\t\tNativeView.AddView(_contentView);\n\t\t}\n\t}\n\n\tpartial void OnOpen(SwipeDirection direction)\n\t{\n\t\tvar items = direction switch\n\t\t{\n\t\t\tSwipeDirection.Left => RightItems,\n\t\t\tSwipeDirection.Right => LeftItems,\n\t\t\tSwipeDirection.Up => null, // vertical not yet supported\n\t\t\tSwipeDirection.Down => null, // vertical not yet supported\n\t\t\t_ => null\n\t\t};\n\n\t\tif (items != null)\n\t\t{\n\t\t\tShowSwipeItems(items, direction);\n\t\t}\n\t}\n\n\tpartial void OnClose()\n\t{\n\t\tResetPosition();\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/Switch.cs",
    "content": "using Android.Content;\nusing AndroidX.AppCompat.Widget;\n\nnamespace Spice;\n\npublic partial class Switch\n{\n\t/// <summary>\n\t/// Returns switchControl.NativeView\n\t/// </summary>\n\t/// <param name=\"switchControl\">The Spice.Switch</param>\n\tpublic static implicit operator SwitchCompat(Switch switchControl) => switchControl.NativeView;\n\n\tstatic SwitchCompat Create(Context context) => new(context);\n\n\t/// <summary>\n\t/// A toggle switch control for boolean on/off input.\n\t/// Android -> AndroidX.AppCompat.Widget.SwitchCompat\n\t/// iOS -> UIKit.UISwitch\n\t/// </summary>\n\tpublic Switch() : this(Platform.Context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic Switch(Context context) : this(context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected Switch(Func<Context, Android.Views.View> creator) : this(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected Switch(Context context, Func<Context, Android.Views.View> creator) : base(context, creator) { }\n\n\t/// <summary>\n\t/// The underlying AndroidX.AppCompat.Widget.SwitchCompat\n\t/// </summary>\n\tpublic new SwitchCompat NativeView => (SwitchCompat)_nativeView.Value;\n\n\tbool _updatingIsOn;\n\n\tpartial void OnIsOnChanged(bool value)\n\t{\n\t\t_updatingIsOn = true;\n\t\tNativeView.Checked = value;\n\t\t_updatingIsOn = false;\n\t}\n\n\tEventHandler<CompoundButton.CheckedChangeEventArgs>? _checkedChange;\n\n\tpartial void OnToggledChanged(Action<Switch>? value)\n\t{\n\t\t// Unsubscribe existing handler if any\n\t\tif (_checkedChange != null)\n\t\t{\n\t\t\tNativeView.CheckedChange -= _checkedChange;\n\t\t\t_checkedChange = null;\n\t\t}\n\n\t\tif (value != null)\n\t\t{\n\t\t\tNativeView.CheckedChange += _checkedChange = (sender, e) =>\n\t\t\t{\n\t\t\t\tif (_updatingIsOn) return;\n\t\t\t\tIsOn = e.IsChecked;\n\t\t\t\tToggled?.Invoke(this);\n\t\t\t};\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/TabView.cs",
    "content": "using Android.Content;\nusing Android.Views;\nusing System.Collections.Specialized;\nusing Google.Android.Material.BottomNavigation;\n\nnamespace Spice;\n\npublic partial class TabView\n{\n\t/// <summary>\n\t/// TabView ctor - creates a container with BottomNavigationView\n\t/// </summary>\n\tpublic TabView() : this(Platform.Context) { }\n\n\t/// <summary>\n\t/// TabView ctor\n\t/// </summary>\n\t/// <param name=\"context\">The Android context</param>\n\tpublic TabView(Context context) : base(context, ctx => new AndroidX.AppCompat.Widget.LinearLayoutCompat(ctx)\n\t{\n\t\tOrientation = (int)Android.Widget.Orientation.Vertical\n\t})\n\t{\n\t\tChildren.CollectionChanged += OnTabsChanged;\n\t}\n\n\t/// <summary>\n\t/// The underlying LinearLayoutCompat\n\t/// </summary>\n\tpublic new AndroidX.AppCompat.Widget.LinearLayoutCompat NativeView => (AndroidX.AppCompat.Widget.LinearLayoutCompat)_nativeView.Value;\n\n\tBottomNavigationView? _bottomNavigationView;\n\tAndroid.Widget.FrameLayout? _contentFrame;\n\tint _selectedTabIndex = 0;\n\n\t/// <summary>\n\t/// Gets or creates the bottom navigation view\n\t/// </summary>\n\tBottomNavigationView BottomNavigationView\n\t{\n\t\tget\n\t\t{\n\t\t\tif (_bottomNavigationView == null)\n\t\t\t{\n\t\t\t\t_bottomNavigationView = new BottomNavigationView(Platform.Context)\n\t\t\t\t{\n\t\t\t\t\tLayoutParameters = new Android.Widget.LinearLayout.LayoutParams(\n\t\t\t\t\t\tViewGroup.LayoutParams.MatchParent,\n\t\t\t\t\t\tViewGroup.LayoutParams.WrapContent)\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\t_bottomNavigationView.ItemSelected += OnNavigationItemSelected;\n\t\t\t\t\n\t\t\t\tNativeView.AddView(_bottomNavigationView);\n\t\t\t}\n\t\t\treturn _bottomNavigationView;\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Gets or creates the content frame\n\t/// </summary>\n\tAndroid.Widget.FrameLayout ContentFrame\n\t{\n\t\tget\n\t\t{\n\t\t\tif (_contentFrame == null)\n\t\t\t{\n\t\t\t\t_contentFrame = new Android.Widget.FrameLayout(Platform.Context)\n\t\t\t\t{\n\t\t\t\t\tLayoutParameters = new Android.Widget.LinearLayout.LayoutParams(\n\t\t\t\t\t\tViewGroup.LayoutParams.MatchParent,\n\t\t\t\t\t\t0, // height\n\t\t\t\t\t\t1.0f) // weight to fill remaining space\n\t\t\t\t};\n\t\t\t\t// Insert before bottom navigation\n\t\t\t\tNativeView.AddView(_contentFrame, 0);\n\t\t\t}\n\t\t\treturn _contentFrame;\n\t\t}\n\t}\n\n\tvoid OnTabsChanged(object? sender, NotifyCollectionChangedEventArgs e)\n\t{\n\t\tUpdateTabs();\n\t}\n\n\tvoid UpdateTabs()\n\t{\n\t\tvar menu = BottomNavigationView.Menu;\n\t\tmenu.Clear();\n\n\t\tint index = 0;\n\t\tforeach (var child in Children)\n\t\t{\n\t\t\tif (child is Tab tab)\n\t\t\t{\n\t\t\t\tvar menuItem = menu.Add(0, index, index, tab.Title);\n\t\t\t\t\n\t\t\t\t// Set icon if available\n\t\t\t\tif (!string.IsNullOrEmpty(tab.Icon))\n\t\t\t\t{\n\t\t\t\t\t// Try to load icon from resources\n\t\t\t\t\tvar context = Platform.Context;\n\t\t\t\t\tif (context != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar resourceId = context.Resources?.GetIdentifier(tab.Icon, \"drawable\", context.PackageName);\n\t\t\t\t\t\tif (resourceId.HasValue && resourceId.Value != 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmenuItem?.SetIcon(resourceId.Value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tindex++;\n\t\t\t}\n\t\t}\n\n\t\t// Restore previously selected tab, or show first tab if new\n\t\tif (Children.Count > 0)\n\t\t{\n\t\t\tvar tabIndex = _selectedTabIndex < Children.Count ? _selectedTabIndex : 0;\n\t\t\tShowTab(tabIndex);\n\t\t}\n\t}\n\n\tvoid OnNavigationItemSelected(object? sender, Google.Android.Material.Navigation.NavigationBarView.ItemSelectedEventArgs e)\n\t{\n\t\tvar index = e.Item.ItemId;\n\t\tShowTab(index);\n\t}\n\n\tvoid ShowTab(int index)\n\t{\n\t\tif (index < 0 || index >= Children.Count)\n\t\t\treturn;\n\n\t\t_selectedTabIndex = index;\n\n\t\tvar tab = Children[index] as Tab;\n\t\tif (tab != null)\n\t\t{\n\t\t\ttab.EnsureContent();\n\t\t\t\n\t\t\tContentFrame.RemoveAllViews();\n\t\t\t\n\t\t\tif (tab.Content != null)\n\t\t\t{\n\t\t\t\t// Remove from current parent if needed (content may be in Tab's Children)\n\t\t\t\tvar parent = ((Android.Views.View)tab.Content).Parent as Android.Views.ViewGroup;\n\t\t\t\tparent?.RemoveView(tab.Content);\n\t\t\t\tContentFrame.AddView(tab.Content);\n\t\t\t}\n\t\t}\n\t}\n}\n\npublic partial class Tab\n{\n\t/// <summary>\n\t/// Tab ctor - tabs are logical containers\n\t/// </summary>\n\tpublic Tab() : this(Platform.Context) { }\n\n\t/// <summary>\n\t/// Tab ctor\n\t/// </summary>\n\t/// <param name=\"context\">The Android context</param>\n\tpublic Tab(Context context) : base(context, ctx => new Android.Widget.FrameLayout(ctx))\n\t{\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/TimePicker.cs",
    "content": "using Android.Content;\nusing Android.App;\nusing Android.Text.Format;\nusing AndroidButton = Android.Widget.Button;\n\nnamespace Spice;\n\npublic partial class TimePicker\n{\n\t/// <summary>\n\t/// Returns timePicker.NativeView\n\t/// </summary>\n\t/// <param name=\"timePicker\">The Spice.TimePicker</param>\n\tpublic static implicit operator AndroidButton(TimePicker timePicker) => timePicker.NativeView;\n\n\tstatic AndroidButton Create(Context context) => new(context);\n\n\t/// <summary>\n\t/// Represents a control that allows the user to select a time value.\n\t/// Android -> Android.App.TimePickerDialog\n\t/// iOS -> UIKit.UIDatePicker (Mode = Time)\n\t/// </summary>\n\tpublic TimePicker() : base(Platform.Context, Create)\n\t{\n\t\tNativeView.Click += OnNativeClick;\n\t\tUpdateButtonText();\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic TimePicker(Context context) : base(context, Create)\n\t{\n\t\tNativeView.Click += OnNativeClick;\n\t\tUpdateButtonText();\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected TimePicker(Func<Context, Android.Views.View> creator) : base(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected TimePicker(Context context, Func<Context, Android.Views.View> creator) : base(context, creator) { }\n\n\t/// <summary>\n\t/// The underlying Android.Widget.Button\n\t/// </summary>\n\tpublic new AndroidButton NativeView => (AndroidButton)_nativeView.Value;\n\n\tpartial void OnTimeChanged(TimeOnly value)\n\t{\n\t\tUpdateButtonText();\n\t}\n\n\tvoid OnNativeClick(object? sender, EventArgs e)\n\t{\n\t\tif (NativeView.Context is not Context context)\n\t\t\treturn;\n\n\t\tvar is24HourView = DateFormat.Is24HourFormat(context);\n\t\tvar dialog = new TimePickerDialog(\n\t\t\tcontext,\n\t\t\tOnTimeSet,\n\t\t\tTime.Hour,\n\t\t\tTime.Minute,\n\t\t\tis24HourView);\n\n\t\tdialog.Show();\n\t}\n\n\tvoid OnTimeSet(object? sender, TimePickerDialog.TimeSetEventArgs e)\n\t{\n\t\tTime = new TimeOnly(e.HourOfDay, e.Minute);\n\t}\n\n\tvoid UpdateButtonText()\n\t{\n\t\tvar context = NativeView.Context;\n\t\tif (context == null)\n\t\t\treturn;\n\n\t\tvar is24HourView = DateFormat.Is24HourFormat(context);\n\t\tvar format = is24HourView ? \"HH:mm\" : \"h:mm tt\";\n\t\tNativeView.Text = Time.ToString(format);\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/Android/Transforms.xml",
    "content": "﻿<metadata>\n  <attr path=\"//class[@visibility='public']\" name=\"visibility\">internal</attr>\n</metadata>"
  },
  {
    "path": "src/Spice/Platforms/Android/View.cs",
    "content": "using System.Collections.Specialized;\nusing Android.Content;\n\nnamespace Spice;\n\npublic partial class View\n{\n\t/// <summary>\n\t/// Returns view.NativeView\n\t/// </summary>\n\t/// <param name=\"view\"></param>\n\tpublic static implicit operator Android.Views.View(View view) => view._nativeView.Value;\n\n\tstatic RelativeLayout Create(Context context) => new(context);\n\n\t/// <summary>\n\t/// View ctor\n\t/// </summary>\n\tpublic View() : this(Platform.Context, Create) { }\n\n\t/// <summary>\n\t/// View ctor\n\t/// </summary>\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic View(Context context) : this(context, Create) { }\n\n\t/// <summary>\n\t/// View ctor\n\t/// </summary>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected View(Func<Context, Android.Views.View> creator) : this(Platform.Context, creator) { }\n\n\t/// <summary>\n\t/// View ctor\n\t/// </summary>\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected View(Context context, Func<Context, Android.Views.View> creator)\n\t{\n\t\t_layoutParameters = new Lazy<Android.Views.ViewGroup.LayoutParams>(CreateLayoutParameters);\n\t\t_nativeView = new Lazy<Android.Views.View>(() =>\n\t\t{\n\t\t\tvar view = creator(context);\n\t\t\tview.LayoutParameters = _layoutParameters.Value;\n\t\t\treturn view;\n\t\t});\n\n\t\tChildren.CollectionChanged += OnChildrenChanged;\n\t}\n\n\t/// <summary>\n\t/// Subclasses can access the lazy LayoutParams\n\t/// </summary>\n\tprotected readonly Lazy<Android.Views.ViewGroup.LayoutParams> _layoutParameters;\n\t/// <summary>\n\t/// Subclasses can access the lazy View\n\t/// </summary>\n\tprotected readonly Lazy<Android.Views.View> _nativeView;\n\n\t/// <summary>\n\t/// Creates the LayoutParams for this view\n\t/// </summary>\n\t/// <returns>Android.Views.ViewGroup.LayoutParams</returns>\n\tprotected virtual Android.Views.ViewGroup.LayoutParams CreateLayoutParameters()\n\t{\n\t\tvar layoutParameters = new RelativeLayout.LayoutParams(Android.Views.ViewGroup.LayoutParams.WrapContent, Android.Views.ViewGroup.LayoutParams.WrapContent);\n\t\tlayoutParameters.AddRule(LayoutRules.CenterHorizontal);\n\t\tlayoutParameters.AddRule(LayoutRules.CenterVertical);\n\t\treturn layoutParameters;\n\t}\n\n\t/// <summary>\n\t/// The underlying Android.Views.ViewGroup\n\t/// </summary>\n\tpublic Android.Views.ViewGroup NativeView => (Android.Views.ViewGroup)_nativeView.Value;\n\n\tvoid OnChildrenChanged(object? sender, NotifyCollectionChangedEventArgs e)\n\t{\n\t\tif (e.OldItems != null)\n\t\t{\n\t\t\tforeach (View item in e.OldItems)\n\t\t\t{\n\t\t\t\tNativeView.RemoveView(item);\n\t\t\t}\n\t\t}\n\n\t\tif (e.NewItems != null)\n\t\t{\n\t\t\tforeach (View item in e.NewItems)\n\t\t\t{\n\t\t\t\tNativeView.AddView(item);\n\t\t\t}\n\t\t}\n\t}\n\n\tpartial void OnHorizontalOptionsChanged(LayoutOptions value)\n\t{\n\t\t// TODO: reduce JNI calls\n\t\tif (_layoutParameters.Value is RelativeLayout.LayoutParams layoutParameters)\n\t\t{\n\t\t\t// TODO: support value changing\n\t\t\tswitch (value.Alignment)\n\t\t\t{\n\t\t\t\tcase LayoutAlignment.Center:\n\t\t\t\t\tlayoutParameters.Width = WidthRequest >= 0 ? GetWidthInPixels() : Android.Views.ViewGroup.LayoutParams.WrapContent;\n\t\t\t\t\tlayoutParameters.AddRule(LayoutRules.CenterHorizontal);\n\t\t\t\t\tbreak;\n\t\t\t\tcase LayoutAlignment.Start:\n\t\t\t\t\tlayoutParameters.Width = WidthRequest >= 0 ? GetWidthInPixels() : Android.Views.ViewGroup.LayoutParams.WrapContent;\n\t\t\t\t\tlayoutParameters.RemoveRule(LayoutRules.CenterHorizontal);\n\t\t\t\t\tlayoutParameters.AddRule(LayoutRules.AlignParentLeft);\n\t\t\t\t\tbreak;\n\t\t\t\tcase LayoutAlignment.End:\n\t\t\t\t\tlayoutParameters.Width = WidthRequest >= 0 ? GetWidthInPixels() : Android.Views.ViewGroup.LayoutParams.WrapContent;\n\t\t\t\t\tlayoutParameters.RemoveRule(LayoutRules.CenterHorizontal);\n\t\t\t\t\tlayoutParameters.AddRule(LayoutRules.AlignParentRight);\n\t\t\t\t\tbreak;\n\t\t\t\tcase LayoutAlignment.Fill:\n\t\t\t\t\tlayoutParameters.Width = WidthRequest >= 0 ? GetWidthInPixels() : Android.Views.ViewGroup.LayoutParams.MatchParent;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new NotSupportedException($\"{nameof(HorizontalOptions)} value '{value.Alignment}' not supported!\");\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthrow new NotSupportedException($\"LayoutParameters of type {_layoutParameters.Value.GetType()} not supported!\");\n\t\t}\n\t}\n\n\tpartial void OnVerticalOptionsChanged(LayoutOptions value)\n\t{\n\t\t// TODO: reduce JNI calls\n\n\t\tif (_layoutParameters.Value is RelativeLayout.LayoutParams layoutParameters)\n\t\t{\n\t\t\t// TODO: support value changing\n\t\t\tswitch (value.Alignment)\n\t\t\t{\n\t\t\t\tcase LayoutAlignment.Center:\n\t\t\t\t\tlayoutParameters.Height = HeightRequest >= 0 ? GetHeightInPixels() : Android.Views.ViewGroup.LayoutParams.WrapContent;\n\t\t\t\t\tlayoutParameters.RemoveRule(LayoutRules.CenterVertical);\n\t\t\t\t\tlayoutParameters.AddRule(LayoutRules.CenterVertical);\n\t\t\t\t\tbreak;\n\t\t\t\tcase LayoutAlignment.Start:\n\t\t\t\t\tlayoutParameters.Height = HeightRequest >= 0 ? GetHeightInPixels() : Android.Views.ViewGroup.LayoutParams.WrapContent;\n\t\t\t\t\tlayoutParameters.RemoveRule(LayoutRules.CenterVertical);\n\t\t\t\t\tlayoutParameters.AddRule(LayoutRules.AlignParentTop);\n\t\t\t\t\tbreak;\n\t\t\t\tcase LayoutAlignment.End:\n\t\t\t\t\tlayoutParameters.Height = HeightRequest >= 0 ? GetHeightInPixels() : Android.Views.ViewGroup.LayoutParams.WrapContent;\n\t\t\t\t\tlayoutParameters.RemoveRule(LayoutRules.CenterVertical);\n\t\t\t\t\tlayoutParameters.AddRule(LayoutRules.AlignParentBottom);\n\t\t\t\t\tbreak;\n\t\t\t\tcase LayoutAlignment.Fill:\n\t\t\t\t\tlayoutParameters.Height = HeightRequest >= 0 ? GetHeightInPixels() : Android.Views.ViewGroup.LayoutParams.MatchParent;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new NotSupportedException($\"{nameof(VerticalOptions)} value '{value.Alignment}' not supported!\");\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthrow new NotSupportedException($\"LayoutParameters of type {_layoutParameters.Value.GetType()} not supported!\");\n\t\t}\n\t}\n\n\tpartial void OnBackgroundColorChanged(Color? value) => _nativeView.Value.SetBackgroundColor(value.ToAndroidColor());\n\n\tpartial void OnIsVisibleChanged(bool value) => _nativeView.Value.Visibility = value ? Android.Views.ViewStates.Visible : Android.Views.ViewStates.Gone;\n\n\tpartial void OnIsEnabledChanged(bool value) => _nativeView.Value.Enabled = value;\n\n\tpartial void OnOpacityChanged(double value) => _nativeView.Value.Alpha = (float)value;\n\n\tpartial void OnAutomationIdChanged(string? value) => _nativeView.Value.ContentDescription = value;\n\n\tpartial void OnMarginChanged(Thickness value)\n\t{\n\t\tif (_layoutParameters.Value is RelativeLayout.LayoutParams layoutParams)\n\t\t{\n\t\t\tlayoutParams.SetMargins(\n\t\t\t\t(int)value.Left.ToPixels(),\n\t\t\t\t(int)value.Top.ToPixels(),\n\t\t\t\t(int)value.Right.ToPixels(),\n\t\t\t\t(int)value.Bottom.ToPixels()\n\t\t\t);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthrow new NotSupportedException($\"LayoutParameters of type {_layoutParameters.Value.GetType()} not supported!\");\n\t\t}\n\t}\n\n\tpartial void OnWidthRequestChanged(double value)\n\t{\n\t\tvar layoutParameters = _layoutParameters.Value;\n\n\t\tif (value < 0)\n\t\t{\n\t\t\tlayoutParameters.Width = HorizontalOptions.Alignment == LayoutAlignment.Fill\n\t\t\t\t? Android.Views.ViewGroup.LayoutParams.MatchParent\n\t\t\t\t: Android.Views.ViewGroup.LayoutParams.WrapContent;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlayoutParameters.Width = GetWidthInPixels();\n\t\t}\n\n\t\t_nativeView.Value.RequestLayout();\n\t}\n\n\tpartial void OnHeightRequestChanged(double value)\n\t{\n\t\tvar layoutParameters = _layoutParameters.Value;\n\n\t\tif (value < 0)\n\t\t{\n\t\t\tlayoutParameters.Height = VerticalOptions.Alignment == LayoutAlignment.Fill\n\t\t\t\t? Android.Views.ViewGroup.LayoutParams.MatchParent\n\t\t\t\t: Android.Views.ViewGroup.LayoutParams.WrapContent;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlayoutParameters.Height = GetHeightInPixels();\n\t\t}\n\n\t\t_nativeView.Value.RequestLayout();\n\t}\n\n\tint GetWidthInPixels()\n\t{\n\t\tvar displayMetrics = _nativeView.Value.Resources?.DisplayMetrics;\n\t\treturn displayMetrics != null ? (int)(WidthRequest * displayMetrics.Density) : (int)WidthRequest;\n\t}\n\n\tint GetHeightInPixels()\n\t{\n\t\tvar displayMetrics = _nativeView.Value.Resources?.DisplayMetrics;\n\t\treturn displayMetrics != null ? (int)(HeightRequest * displayMetrics.Density) : (int)HeightRequest;\n\t}\n\n\tprivate partial double GetWidth()\n\t{\n\t\tvar view = _nativeView.Value;\n\t\t// Convert from pixels to device-independent units\n\t\tvar displayMetrics = view.Resources?.DisplayMetrics;\n\t\tif (displayMetrics != null)\n\t\t{\n\t\t\treturn view.Width / displayMetrics.Density;\n\t\t}\n\t\treturn view.Width;\n\t}\n\n\tprivate partial double GetHeight()\n\t{\n\t\tvar view = _nativeView.Value;\n\t\t// Convert from pixels to device-independent units\n\t\tvar displayMetrics = view.Resources?.DisplayMetrics;\n\t\tif (displayMetrics != null)\n\t\t{\n\t\t\treturn view.Height / displayMetrics.Density;\n\t\t}\n\t\treturn view.Height;\n\t}\n\n\tSpiceModalFragment? _presentedFragment;\n\n\tprivate partial Task PresentAsyncCore(View view)\n\t{\n\t\tvar activity = Platform.Context as AndroidX.AppCompat.App.AppCompatActivity;\n\t\tif (activity == null)\n\t\t{\n\t\t\treturn Task.CompletedTask;\n\t\t}\n\n\t\t_presentedFragment = new SpiceModalFragment(view);\n\t\t_presentedFragment.Show(activity.SupportFragmentManager, \"spice_modal\");\n\n\t\treturn Task.CompletedTask;\n\t}\n\n\tprivate partial Task DismissAsyncCore()\n\t{\n\t\tif (_presentedFragment != null)\n\t\t{\n\t\t\t_presentedFragment.Dismiss();\n\t\t\t_presentedFragment = null;\n\t\t}\n\n\t\treturn Task.CompletedTask;\n\t}\n\n\tclass SpiceModalFragment : AndroidX.Fragment.App.DialogFragment\n\t{\n\t\treadonly View _spiceView;\n\n\t\tpublic SpiceModalFragment(View spiceView)\n\t\t{\n\t\t\t_spiceView = spiceView;\n\t\t}\n\n\t\tpublic override Android.Views.View OnCreateView(Android.Views.LayoutInflater inflater, Android.Views.ViewGroup? container, Android.OS.Bundle? savedInstanceState)\n\t\t{\n\t\t\tvar frame = new Android.Widget.FrameLayout(RequireContext())\n\t\t\t{\n\t\t\t\tLayoutParameters = new Android.Views.ViewGroup.LayoutParams(\n\t\t\t\t\tAndroid.Views.ViewGroup.LayoutParams.MatchParent,\n\t\t\t\t\tAndroid.Views.ViewGroup.LayoutParams.MatchParent)\n\t\t\t};\n\t\t\tframe.AddView(_spiceView);\n\t\t\treturn frame;\n\t\t}\n\n\t\tpublic override void OnStart()\n\t\t{\n\t\t\tbase.OnStart();\n\n\t\t\tDialog?.Window?.SetLayout(\n\t\t\t\tAndroid.Views.ViewGroup.LayoutParams.MatchParent,\n\t\t\t\tAndroid.Views.ViewGroup.LayoutParams.MatchParent);\n\n\t\t\tif (!string.IsNullOrEmpty(_spiceView.Title))\n\t\t\t{\n\t\t\t\tDialog?.SetTitle(_spiceView.Title);\n\t\t\t}\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/Spice/Platforms/Android/WebView.cs",
    "content": "﻿using Android.Content;\nusing Android.OS;\nusing Android.Runtime;\nusing Android.Webkit;\n\nnamespace Spice;\n\npublic partial class WebView\n{\n\t/// <summary>\n\t/// Returns view.NativeView\n\t/// </summary>\n\t/// <param name=\"view\">The Spice.WebView</param>\n\tpublic static implicit operator Android.Webkit.WebView(WebView view) => view.NativeView;\n\n\tinternal static Android.Webkit.WebView Create(Context context)\n\t{\n\t\tvar view = new Android.Webkit.WebView(context);\n\t\tvar settings = view.Settings;\n\t\tsettings.JavaScriptEnabled = true; // This is the default for IsJavaScriptEnabled\n\t\tsettings.DomStorageEnabled = true;\n\t\tsettings.SetSupportMultipleWindows(support: true);\n\t\treturn view;\n\t}\n\n\t/// <summary>\n\t/// A \"web view\" for rendering HTML content on each platform.\n\t/// Android -> Android.Webkit.WebView\n\t/// iOS -> WebKit.WKWebView\n\t/// </summary>\n\tpublic WebView() : this(Platform.Context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\tpublic WebView(Context context) : this(context, Create) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected WebView(Func<Context, Android.Views.View> creator) : this(Platform.Context, creator) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"context\">Option to pass the desired Context, otherwise Platform.Context is used</param>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a Android.Views.View</param>\n\tprotected WebView(Context context, Func<Context, Android.Views.View> creator) : base(context, creator) => Initialize();\n\n\t// Called by ctors\n\tvoid Initialize()\n\t{\n\t\t// Most users would want this default instead of center\n\t\tHorizontalOptions = LayoutOptions.Fill;\n\t\tVerticalOptions = LayoutOptions.Fill;\n\n\t\tSetClients();\n\t}\n\n\t/// <summary>\n\t/// Override to provide your own WebViewClient or WebChromeClient\n\t/// </summary>\n\tprotected virtual void SetClients()\n\t{\n\t\tvar view = NativeView;\n\t\tview.SetWebViewClient(new SpiceWebViewClient());\n\t\tview.SetWebChromeClient(new SpiceWebChromeClient());\n\t}\n\n\t/// <summary>\n\t/// The underlying Android.WebKit.WebView\n\t/// </summary>\n\tpublic new Android.Webkit.WebView NativeView => (Android.Webkit.WebView)_nativeView.Value;\n\n\tpartial void OnSourceChanged(string value) => NativeView.LoadUrl(value);\n\n\tpartial void OnIsJavaScriptEnabledChanged(bool value) => NativeView.Settings.JavaScriptEnabled = value;\n\n\t/// <summary>\n\t/// Returns true if you can go back\n\t/// </summary>\n\tpublic bool CanGoBack => NativeView.CanGoBack();\n\n\t/// <summary>\n\t/// Navigates back if possible\n\t/// </summary>\n\tpublic void Back()\n\t{\n\t\tNativeView.GoBack();\n\t\tOnPropertyChanged(nameof(CanGoBack));\n\t}\n\n\t/// <summary>\n\t/// Returns true if you can go forward\n\t/// </summary>\n\tpublic bool CanGoForward => NativeView.CanGoForward();\n\n\t/// <summary>\n\t/// Navigates forward if possible\n\t/// </summary>\n\tpublic void Forward()\n\t{\n\t\tNativeView.GoForward();\n\t\tOnPropertyChanged(nameof(CanGoForward));\n\t}\n\n\tinternal class SpiceWebViewClient : WebViewClient\n\t{\n\t\tpublic SpiceWebViewClient() { }\n\n\t\tprotected SpiceWebViewClient(nint javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) { }\n\n\t\tpublic override bool ShouldOverrideUrlLoading(Android.Webkit.WebView? view, IWebResourceRequest? request)\n\t\t{\n\t\t\t// Return false for http/https to navigate to the URL within the WebView\n\t\t\t// Otherwise it launches the default browser from the OS\n\t\t\tvar scheme = request?.Url?.Scheme;\n\t\t\treturn scheme != \"http\" && scheme != \"https\";\n\t\t}\n\t}\n\n\tinternal class SpiceWebChromeClient : WebChromeClient\n\t{\n\t\tpublic SpiceWebChromeClient() { }\n\n\t\tprotected SpiceWebChromeClient(nint javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) { }\n\n\t\t// From: https://github.com/dotnet/maui/blob/260fa08b0f75fbbb945375592896dd9eb374f22f/src/BlazorWebView/src/Maui/Android/BlazorWebChromeClient.cs#L17\n\t\tpublic override bool OnCreateWindow(Android.Webkit.WebView? view, bool isDialog, bool isUserGesture, Message? resultMsg)\n\t\t{\n\t\t\tif (view?.Context is not null)\n\t\t\t{\n\t\t\t\t// Intercept _blank target <a> tags to always open in device browser\n\t\t\t\t// regardless of UrlLoadingStrategy.OpenInWebview\n\t\t\t\tvar requestUrl = view.GetHitTestResult().Extra;\n\t\t\t\tvar intent = new Intent(Intent.ActionView, Android.Net.Uri.Parse(requestUrl));\n\t\t\t\tview.Context.StartActivity(intent);\n\t\t\t}\n\n\t\t\t// We don't actually want to create a new WebView window so we just return false \n\t\t\treturn false;\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/Spice/Platforms/iOS/ActivityIndicator.cs",
    "content": "namespace Spice;\n\npublic partial class ActivityIndicator\n{\n\t/// <summary>\n\t/// Returns activityIndicator.NativeView\n\t/// </summary>\n\t/// <param name=\"activityIndicator\">The Spice.ActivityIndicator</param>\n\tpublic static implicit operator UIActivityIndicatorView(ActivityIndicator activityIndicator) => activityIndicator.NativeView;\n\n\t/// <summary>\n\t/// Represents a loading spinner on screen. Set the IsRunning property to true to show the spinner.\n\t/// Android -> Android.Widget.ProgressBar (indeterminate)\n\t/// iOS -> UIKit.UIActivityIndicatorView\n\t/// </summary>\n\tpublic ActivityIndicator() : base(_ => new UIActivityIndicatorView { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic ActivityIndicator(CGRect frame) : base(_ => new UIActivityIndicatorView(frame) { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected ActivityIndicator(Func<View, UIView> creator) : base(creator) { }\n\n\t/// <summary>\n\t/// The underlying UIActivityIndicatorView\n\t/// </summary>\n\tpublic new UIActivityIndicatorView NativeView => (UIActivityIndicatorView)_nativeView.Value;\n\n\tpartial void OnIsRunningChanged(bool value)\n\t{\n\t\tif (value)\n\t\t{\n\t\t\tNativeView.StartAnimating();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tNativeView.StopAnimating();\n\t\t}\n\t}\n\n\tpartial void OnColorChanged(Color? value) => NativeView.Color = value.ToUIColor();\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/Application.cs",
    "content": "namespace Spice;\n\npublic partial class Application\n{\n\t/// <summary>\n\t/// The root \"view\" of a Spice application. Set Main to a single view.\n\t/// </summary>\n\tpublic Application() : base(_ => new UIView(Platform.Window!.Frame) { AutoresizingMask = UIViewAutoresizing.All }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic Application(CGRect frame) : base(_ => new UIView(frame) { AutoresizingMask = UIViewAutoresizing.All }) { }\n\n\tNSLayoutConstraint[]? _mainConstraints;\n\n\tpartial void OnMainChanging(View? value)\n\t{\n\t\tif (_main != null)\n\t\t{\n\t\t\tConstraintHelper.RemoveConstraints(_mainConstraints);\n\t\t\t_mainConstraints = null;\n\t\t\t((UIView)_main).RemoveFromSuperview();\n\t\t}\n\t}\n\n\tpartial void OnMainChanged(View? value)\n\t{\n\t\tif (value != null)\n\t\t{\n\t\t\tUIView native = value;\n\t\t\tNativeView.AddSubview(native);\n\t\t\t_mainConstraints = ConstraintHelper.PinEdges(native, NativeView);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/Blazor/BlazorWebView.cs",
    "content": "﻿using System.Globalization;\nusing System.Runtime.Versioning;\n\nusing WebKit;\n\nnamespace Spice;\n\npublic partial class BlazorWebView\n{\n\t/// <summary>\n\t/// Returns view.NativeView\n\t/// </summary>\n\t/// <param name=\"view\">The Spice.BlazorWebView</param>\n\tpublic static implicit operator WKWebView(BlazorWebView view) => view.NativeView;\n\n\tinternal const string AppOrigin = \"app://\" + BlazorWebView.AppHostAddress + \"/\";\n\tinternal static readonly Uri AppOriginUri = new(AppOrigin);\n\tconst string BlazorInitScript = @\"\n\t\twindow.__receiveMessageCallbacks = [];\n\t\twindow.__dispatchMessageCallback = function(message) {\n\t\t\twindow.__receiveMessageCallbacks.forEach(function(callback) { callback(message); });\n\t\t};\n\t\twindow.external = {\n\t\t\tsendMessage: function(message) {\n\t\t\t\twindow.webkit.messageHandlers.webwindowinterop.postMessage(message);\n\t\t\t},\n\t\t\treceiveMessage: function(callback) {\n\t\t\t\twindow.__receiveMessageCallbacks.push(callback);\n\t\t\t}\n\t\t};\n\n\t\tBlazor.start();\n\n\t\t(function () {\n\t\t\twindow.onpageshow = function(event) {\n\t\t\t\tif (event.persisted) {\n\t\t\t\t\twindow.location.reload();\n\t\t\t\t}\n\t\t\t};\n\t\t})();\n\t\";\n\n\tstatic new WKWebViewConfiguration CreateConfiguration()\n\t{\n\t\tvar config = WebView.CreateConfiguration();\n\t\tvar schemeHandler = new SchemeHandler();\n\n\t\tconfig.UserContentController.AddScriptMessageHandler(new WebViewScriptMessageHandler(schemeHandler), \"webwindowinterop\");\n\t\tconfig.UserContentController.AddUserScript(new WKUserScript(\n\t\t\tnew NSString(BlazorInitScript), WKUserScriptInjectionTime.AtDocumentEnd, true));\n\n\t\t// iOS WKWebView doesn't allow handling 'http'/'https' schemes, so we use the fake 'app' scheme\n\t\tconfig.SetUrlSchemeHandler(schemeHandler, urlScheme: \"app\");\n\n\t\treturn config;\n\t}\n\n\t/// <summary>\n\t/// A \"web view\" for rendering HTML content on each platform.\n\t/// Android -> Android.Webkit.WebView\n\t/// iOS -> WebKit.WKWebView\n\t/// </summary>\n\tpublic BlazorWebView() : this(_ => Create(CGRect.Empty, CreateConfiguration)) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic BlazorWebView(CGRect frame) : this(_ => Create(frame, CreateConfiguration)) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected BlazorWebView(Func<View, UIView> creator) : base(creator)\n\t{\n\t\t//TODO: do something better than this\n\t\tif (NativeView.Configuration.GetUrlSchemeHandler(urlScheme: \"app\") is SchemeHandler s)\n\t\t{\n\t\t\ts.WebView = this;\n\t\t}\n\n\t\tInitialize();\n\t}\n\n\t/// <summary>\n\t/// The underlying WebKit.WKWebView\n\t/// </summary>\n\tpublic new WKWebView NativeView => (WKWebView)_nativeView.Value;\n\n\tstatic iOSFileProvider? _fileProvider;\n\tiOSWebViewManager? _webViewManager;\n\n\tinternal iOSWebViewManager? Manager => _webViewManager;\n\n\tpartial void LoadNativeWebView(string contentRootDir, string hostPageRelativePath)\n\t{\n\t\tif (_fileProvider is null)\n\t\t{\n\t\t\t_fileProvider = new iOSFileProvider(contentRootDir);\n\t\t}\n\t\t_webViewManager = new iOSWebViewManager(NativeView, SpiceServiceProvider.Instance, SpiceDispatcher.Instance, _fileProvider, _jSComponents, contentRootDir, hostPageRelativePath);\n\n\t\tforeach (var component in RootComponents)\n\t\t{\n\t\t\t// Since the page isn't loaded yet, this will always complete synchronously\n\t\t\t_ = component.AddToWebViewManagerAsync(_webViewManager);\n\t\t}\n\n\t\t_webViewManager.Navigate(StartPath);\n\t}\n\n\tprivate class WebViewScriptMessageHandler : NSObject, IWKScriptMessageHandler\n\t{\n\t\treadonly WeakReference<SchemeHandler> _schemeHandler;\n\n\t\tpublic WebViewScriptMessageHandler(SchemeHandler schemeHandler) => _schemeHandler = new(schemeHandler);\n\n\t\tpublic void DidReceiveScriptMessage(WKUserContentController userContentController, WKScriptMessage message)\n\t\t{\n\t\t\tArgumentNullException.ThrowIfNull(message);\n\n\t\t\tif (_schemeHandler.TryGetTarget(out var schemeHandler))\n\t\t\t\tschemeHandler.WebView?.Manager?.MessageReceivedInternal(AppOriginUri, ((NSString)message.Body).ToString());\n\t\t}\n\t}\n\n\tprivate class SchemeHandler : NSObject, IWKUrlSchemeHandler\n\t{\n\t\tWeakReference<BlazorWebView>? _webView;\n\n\t\tpublic BlazorWebView? WebView\n\t\t{\n\t\t\tget => _webView is not null && _webView.TryGetTarget(out var wv) ? wv : null;\n\t\t\tset => _webView = value is not null ? new(value) : null;\n\t\t}\n\n\t\t[Export(\"webView:startURLSchemeTask:\")]\n\t\t[SupportedOSPlatform(\"ios11.0\")]\n\t\tpublic void StartUrlSchemeTask(WKWebView webView, IWKUrlSchemeTask urlSchemeTask)\n\t\t{\n\t\t\tvar responseBytes = GetResponseBytes(urlSchemeTask.Request.Url?.AbsoluteString ?? \"\", out var contentType, statusCode: out var statusCode);\n\t\t\tif (statusCode == 200)\n\t\t\t{\n\t\t\t\tusing (var dic = new NSMutableDictionary<NSString, NSString>())\n\t\t\t\t{\n\t\t\t\t\tdic.Add((NSString)\"Content-Length\", (NSString)(responseBytes.Length.ToString(CultureInfo.InvariantCulture)));\n\t\t\t\t\tdic.Add((NSString)\"Content-Type\", (NSString)contentType);\n\t\t\t\t\t// Disable local caching. This will prevent user scripts from executing correctly.\n\t\t\t\t\tdic.Add((NSString)\"Cache-Control\", (NSString)\"no-cache, max-age=0, must-revalidate, no-store\");\n\t\t\t\t\tif (urlSchemeTask.Request.Url != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tusing var response = new NSHttpUrlResponse(urlSchemeTask.Request.Url, statusCode, \"HTTP/1.1\", dic);\n\t\t\t\t\t\turlSchemeTask.DidReceiveResponse(response);\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\turlSchemeTask.DidReceiveData(NSData.FromArray(responseBytes));\n\t\t\t\turlSchemeTask.DidFinish();\n\t\t\t}\n\t\t}\n\n\t\tbyte[] GetResponseBytes(string? url, out string contentType, out int statusCode)\n\t\t{\n\t\t\tvar allowFallbackOnHostPage = AppOriginUri.IsBaseOfPage(url);\n\t\t\turl = UriExtensions.RemovePossibleQueryString(url);\n\n\t\t\tif (WebView?.Manager is iOSWebViewManager m && m.TryGetResponseContentInternal(url, allowFallbackOnHostPage, out statusCode, out var statusMessage, out var content, out var headers))\n\t\t\t{\n\t\t\t\tstatusCode = 200;\n\t\t\t\tusing var ms = new MemoryStream();\n\n\t\t\t\tcontent.CopyTo(ms);\n\t\t\t\tcontent.Dispose();\n\n\t\t\t\tcontentType = headers[\"Content-Type\"];\n\t\t\t\treturn ms.ToArray();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstatusCode = 404;\n\t\t\t\tcontentType = string.Empty;\n\t\t\t\treturn Array.Empty<byte>();\n\t\t\t}\n\t\t}\n\n\t\t[Export(\"webView:stopURLSchemeTask:\")]\n\t\tpublic void StopUrlSchemeTask(WKWebView webView, IWKUrlSchemeTask urlSchemeTask)\n\t\t{\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/Blazor/SpiceDispatcher.cs",
    "content": "﻿using System.Reflection.Metadata;\n\nusing CoreFoundation;\n\nusing Microsoft.AspNetCore.Components;\nusing Microsoft.Extensions.Logging;\n\nnamespace Spice;\n\ninternal partial class SpiceDispatcher : Dispatcher\n{\n\treadonly DispatchQueue _dispatchQueue;\n\n\tpublic SpiceDispatcher()\n\t{\n\t\t_dispatchQueue = DispatchQueue.MainQueue;\n\t}\n\n\tpublic override bool CheckAccess() => DispatchQueue.CurrentQueueLabel == _dispatchQueue.Label;\n\n\tpublic override Task InvokeAsync(Action workItem)\n\t{\n\t\tvar tcs = new TaskCompletionSource<object>();\n\n\t\t_dispatchQueue.DispatchAsync(() =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tworkItem();\n\t\t\t\ttcs.SetResult(new object());\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\ttcs.SetException(ex);\n\t\t\t}\n\t\t});\n\n\t\treturn tcs.Task;\n\t}\n\n\tpublic override Task InvokeAsync(Func<Task> workItem)\n\t{\n\t\tvar tcs = new TaskCompletionSource<object>();\n\n\t\t_dispatchQueue.DispatchAsync(async () =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tawait workItem();\n\t\t\t\ttcs.SetResult(new object());\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\ttcs.SetException(ex);\n\t\t\t}\n\t\t});\n\n\t\treturn tcs.Task;\n\t}\n\n\tpublic override Task<TResult> InvokeAsync<TResult>(Func<TResult> workItem)\n\t{\n\t\tvar tcs = new TaskCompletionSource<TResult>();\n\n\t\t_dispatchQueue.DispatchAsync(() =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\ttcs.SetResult(workItem());\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\ttcs.SetException(ex);\n\t\t\t}\n\t\t});\n\n\t\treturn tcs.Task;\n\t}\n\n\tpublic override Task<TResult> InvokeAsync<TResult>(Func<Task<TResult>> workItem)\n\t{\n\t\tvar tcs = new TaskCompletionSource<TResult>();\n\n\t\t_dispatchQueue.DispatchAsync(async () =>\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\ttcs.SetResult(await workItem());\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\ttcs.SetException(ex);\n\t\t\t}\n\t\t});\n\n\t\treturn tcs.Task;\n\t}\n}\n\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/Blazor/iOSFileProvider.cs",
    "content": "﻿// From: https://github.com/dotnet/maui/blob/c8a6093ee805388732af8d75b437b099a301db22/src/BlazorWebView/src/Maui/iOS/iOSMauiAssetFileProvider.cs\nusing Foundation;\nusing System.Collections;\nusing Microsoft.Extensions.FileProviders;\nusing Microsoft.Extensions.Primitives;\n\nnamespace Spice;\n\n/// <summary>\n/// A minimal implementation of an IFileProvider to be used by the BlazorWebView and WebViewManager types.\n/// </summary>\ninternal sealed class iOSFileProvider : IFileProvider\n{\n\tprivate readonly string _bundleRootDir;\n\n\tpublic iOSFileProvider(string contentRootDir)\n\t{\n\t\t_bundleRootDir = Path.Combine(NSBundle.MainBundle.ResourcePath, contentRootDir);\n\t}\n\n\tpublic IDirectoryContents GetDirectoryContents(string subpath)\n\t\t=> new iOSMauiAssetDirectoryContents(Path.Combine(_bundleRootDir, subpath));\n\n\tpublic IFileInfo GetFileInfo(string subpath)\n\t\t=> new iOSMauiAssetFileInfo(Path.Combine(_bundleRootDir, subpath));\n\n\tpublic IChangeToken Watch(string filter)\n\t\t=> NullChangeToken.Singleton;\n\n\tprivate sealed class iOSMauiAssetFileInfo : IFileInfo\n\t{\n\t\tprivate readonly string _filePath;\n\n\t\tpublic iOSMauiAssetFileInfo(string filePath)\n\t\t{\n\t\t\t_filePath = filePath;\n\n\t\t\tName = Path.GetFileName(_filePath);\n\n\t\t\tvar fileInfo = new FileInfo(_filePath);\n\t\t\tExists = fileInfo.Exists;\n\t\t\tLength = Exists ? fileInfo.Length : -1;\n\t\t}\n\n\t\tpublic bool Exists { get; }\n\t\tpublic long Length { get; }\n\t\tpublic string PhysicalPath { get; } = null!;\n\t\tpublic string Name { get; }\n\t\tpublic DateTimeOffset LastModified { get; } = DateTimeOffset.FromUnixTimeSeconds(0);\n\t\tpublic bool IsDirectory => false;\n\n\t\tpublic Stream CreateReadStream()\n\t\t\t=> File.OpenRead(_filePath);\n\t}\n\n\t// This is never used by BlazorWebView or WebViewManager\n\tprivate sealed class iOSMauiAssetDirectoryContents : IDirectoryContents\n\t{\n\t\tpublic iOSMauiAssetDirectoryContents(string filePath)\n\t\t{\n\t\t}\n\n\t\tpublic bool Exists => false;\n\n\t\tpublic IEnumerator<IFileInfo> GetEnumerator()\n\t\t\t=> throw new NotImplementedException();\n\n\t\tIEnumerator IEnumerable.GetEnumerator()\n\t\t\t=> throw new NotImplementedException();\n\t}\n}"
  },
  {
    "path": "src/Spice/Platforms/iOS/Blazor/iOSWebViewManager.cs",
    "content": "﻿//From: https://github.com/dotnet/maui/blob/c8a6093ee805388732af8d75b437b099a301db22/src/BlazorWebView/src/Maui/iOS/IOSWebViewManager.cs\nusing System.Runtime.InteropServices;\nusing System.Text.Encodings.Web;\nusing CoreFoundation;\nusing Foundation;\nusing Microsoft.AspNetCore.Components;\nusing Microsoft.AspNetCore.Components.Web;\nusing Microsoft.AspNetCore.Components.WebView;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.FileProviders;\nusing Microsoft.Extensions.Logging;\nusing ObjCRuntime;\nusing UIKit;\nusing WebKit;\n\nnamespace Spice;\n\n/// <summary>\n/// An implementation of <see cref=\"WebViewManager\"/> that uses the <see cref=\"WKWebView\"/> browser control\n/// to render web content.\n/// </summary>\ninternal class iOSWebViewManager : WebViewManager\n{\n\tprivate readonly WKWebView _webview;\n\tprivate readonly string _contentRootRelativeToAppRoot;\n\n\t/// <summary>\n\t/// Initializes a new instance of <see cref=\"iOSWebViewManager\"/>\n\t/// </summary>\n\t/// <param name=\"webview\">The <see cref=\"WKWebView\"/> to render web content in.</param>\n\t/// <param name=\"provider\">The <see cref=\"IServiceProvider\"/> for the application.</param>\n\t/// <param name=\"dispatcher\">A <see cref=\"Dispatcher\"/> instance instance that can marshal calls to the required thread or sync context.</param>\n\t/// <param name=\"fileProvider\">Provides static content to the webview.</param>\n\t/// <param name=\"jsComponents\">Describes configuration for adding, removing, and updating root components from JavaScript code.</param>\n\t/// <param name=\"contentRootRelativeToAppRoot\">Path to the directory containing application content files.</param>\n\t/// <param name=\"hostPageRelativePath\">Path to the host page within the fileProvider.</param>\n\n\tpublic iOSWebViewManager(WKWebView webview, IServiceProvider provider, Dispatcher dispatcher, IFileProvider fileProvider, JSComponentConfigurationStore jsComponents, string contentRootRelativeToAppRoot, string hostPageRelativePath)\n\t\t: base(provider, dispatcher, BlazorWebView.AppOriginUri, fileProvider, jsComponents, hostPageRelativePath)\n\t{\n\t\tArgumentNullException.ThrowIfNull(webview);\n\n\t\t_webview = webview;\n\t\t_contentRootRelativeToAppRoot = contentRootRelativeToAppRoot;\n\n\t\tInitializeWebView();\n\t}\n\n\t/// <inheritdoc />\n\tprotected override void NavigateCore(Uri absoluteUri)\n\t{\n\t\tusing var nsUrl = new NSUrl(absoluteUri.ToString());\n\t\tusing var request = new NSUrlRequest(nsUrl);\n\t\t_webview.LoadRequest(request);\n\t}\n\n\tinternal bool TryGetResponseContentInternal(string uri, bool allowFallbackOnHostPage, out int statusCode, out string statusMessage, out Stream content, out IDictionary<string, string> headers)\n\t{\n\t\treturn TryGetResponseContent(uri, allowFallbackOnHostPage, out statusCode, out statusMessage, out content, out headers);\n\n\t\t// TODO: hot reload support?\n\t\t//var hotReloadedResult = StaticContentHotReloadManager.TryReplaceResponseContent(_contentRootRelativeToAppRoot, uri, ref statusCode, ref content, headers);\n\t\t//return defaultResult || hotReloadedResult;\n\t}\n\n\t/// <inheritdoc />\n\tprotected override void SendMessage(string message)\n\t{\n\t\tvar messageJSStringLiteral = JavaScriptEncoder.Default.Encode(message);\n\t\t_webview.EvaluateJavaScript(\n\t\t\tjavascript: $\"__dispatchMessageCallback(\\\"{messageJSStringLiteral}\\\")\",\n\t\t\tcompletionHandler: (NSObject? result, NSError? error) => { });\n\t}\n\n\tinternal void MessageReceivedInternal(Uri uri, string message)\n\t{\n\t\tMessageReceived(uri, message);\n\t}\n\n\tprivate void InitializeWebView()\n\t{\n\t\t_webview.NavigationDelegate = new WebViewNavigationDelegate();\n\t\t_webview.UIDelegate = new WebViewUIDelegate();\n\t}\n\n\tinternal sealed class WebViewUIDelegate : WKUIDelegate\n\t{\n\t\tprivate static readonly string LocalOK = NSBundle.FromIdentifier(\"com.apple.UIKit\").GetLocalizedString(\"OK\");\n\t\tprivate static readonly string LocalCancel = NSBundle.FromIdentifier(\"com.apple.UIKit\").GetLocalizedString(\"Cancel\");\n\n\t\tpublic override void RunJavaScriptAlertPanel(WKWebView webView, string message, WKFrameInfo frame, Action completionHandler)\n\t\t{\n\t\t\tPresentAlertController(\n\t\t\t\twebView,\n\t\t\t\tmessage,\n\t\t\t\tokAction: _ => completionHandler()\n\t\t\t);\n\t\t}\n\n\t\tpublic override void RunJavaScriptConfirmPanel(WKWebView webView, string message, WKFrameInfo frame, Action<bool> completionHandler)\n\t\t{\n\t\t\tPresentAlertController(\n\t\t\t\twebView,\n\t\t\t\tmessage,\n\t\t\t\tokAction: _ => completionHandler(true),\n\t\t\t\tcancelAction: _ => completionHandler(false)\n\t\t\t);\n\t\t}\n\n\t\t// TODO: this should be an override but requires XAMCORE_5_0:\n\t\t//       https://github.com/dotnet/macios/issues/15728\n\t\t//       https://github.com/dotnet/macios/pull/22199\n\t\t[Export(\"webView:runJavaScriptTextInputPanelWithPrompt:defaultText:initiatedByFrame:completionHandler:\")]\n\t\tpublic void RunJavaScriptTextInputPanelWithPrompt(\n\t\t\tWKWebView webView,\n\t\t\tstring prompt,\n\t\t\tstring? defaultText,\n\t\t\tWKFrameInfo frame,\n\t\t\tIntPtr completionHandlerBlock)\n\t\t{\n\t\t\tvar completionHandler = ActionStringTrampolineBlock.Create(completionHandlerBlock);\n\t\t\tPresentAlertController(\n\t\t\t\twebView,\n\t\t\t\tprompt,\n\t\t\t\tdefaultText: defaultText,\n\t\t\t\tokAction: x => completionHandler?.Invoke(x.TextFields[0].Text),\n\t\t\t\tcancelAction: _ => completionHandler?.Invoke(null)\n\t\t\t);\n\t\t}\n\n\t\tprivate static string GetJsAlertTitle(WKWebView webView)\n\t\t{\n\t\t\t// Emulate the behavior of UIWebView dialogs.\n\t\t\t// The scheme and host are used unless local html content is what the webview is displaying,\n\t\t\t// in which case the bundle file name is used.\n\t\t\tif (webView.Url != null && webView.Url.AbsoluteString != $\"file://{NSBundle.MainBundle.BundlePath}/\")\n\t\t\t\treturn $\"{webView.Url.Scheme}://{webView.Url.Host}\";\n\n\t\t\treturn new NSString(NSBundle.MainBundle.BundlePath).LastPathComponent;\n\t\t}\n\n\t\tprivate static UIAlertAction AddOkAction(UIAlertController controller, Action handler)\n\t\t{\n\t\t\tvar action = UIAlertAction.Create(LocalOK, UIAlertActionStyle.Default, (_) => handler());\n\t\t\tcontroller.AddAction(action);\n\t\t\tcontroller.PreferredAction = action;\n\t\t\treturn action;\n\t\t}\n\n\t\tprivate static UIAlertAction AddCancelAction(UIAlertController controller, Action handler)\n\t\t{\n\t\t\tvar action = UIAlertAction.Create(LocalCancel, UIAlertActionStyle.Cancel, (_) => handler());\n\t\t\tcontroller.AddAction(action);\n\t\t\treturn action;\n\t\t}\n\n\t\tprivate static void PresentAlertController(\n\t\t\tWKWebView webView,\n\t\t\tstring message,\n\t\t\tstring? defaultText = null,\n\t\t\tAction<UIAlertController>? okAction = null,\n\t\t\tAction<UIAlertController>? cancelAction = null)\n\t\t{\n\t\t\tvar controller = UIAlertController.Create(GetJsAlertTitle(webView), message, UIAlertControllerStyle.Alert);\n\n\t\t\tif (defaultText != null)\n\t\t\t\tcontroller.AddTextField((textField) => textField.Text = defaultText);\n\n\t\t\tif (okAction != null)\n\t\t\t\tAddOkAction(controller, () => okAction(controller));\n\n\t\t\tif (cancelAction != null)\n\t\t\t\tAddCancelAction(controller, () => cancelAction(controller));\n\n#pragma warning disable CA1416 // TODO:  'UIApplication.Windows' is unsupported on: 'ios' 15.0 and later\n\t\t\tGetTopViewController(Platform.Window?.RootViewController)?\n\t\t\t\t.PresentViewController(controller, true, null);\n#pragma warning restore CA1416\n\t\t}\n\n\t\tprivate static UIViewController? GetTopViewController(UIViewController? viewController)\n\t\t{\n\t\t\tif (viewController is UINavigationController navigationController)\n\t\t\t\treturn GetTopViewController(navigationController.VisibleViewController);\n\n\t\t\tif (viewController is UITabBarController tabBarController)\n\t\t\t\treturn GetTopViewController(tabBarController.SelectedViewController!);\n\n\t\t\tif (viewController?.PresentedViewController != null)\n\t\t\t\treturn GetTopViewController(viewController.PresentedViewController);\n\n\t\t\treturn viewController;\n\t\t}\n\n\t\t// TODO: Remove after XAMCORE_5_0 is live:\n\t\t//       https://github.com/dotnet/macios/issues/15728\n\t\t//       https://github.com/dotnet/macios/pull/22199\n\t\tsealed class ActionStringTrampolineBlock : TrampolineBlockBase\n\t\t{\n\t\t\t[UnmanagedFunctionPointer(CallingConvention.Cdecl)]\n\t\t\t[UserDelegateType(typeof(Action<string?>))]\n\t\t\tdelegate void Invoker(IntPtr block, NativeHandle obj);\n\n\t\t\tInvoker invoker;\n\n\t\t\tpublic unsafe ActionStringTrampolineBlock(BlockLiteral* block)\n\t\t\t\t: base(block)\n\t\t\t{\n\t\t\t\tinvoker = block->GetDelegateForBlock<Invoker>();\n\t\t\t}\n\n\t\t\t[Preserve(Conditional = true)]\n\t\t\tpublic unsafe static Action<string?>? Create(IntPtr block)\n\t\t\t{\n\t\t\t\tif (block == IntPtr.Zero)\n\t\t\t\t{\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tvar del = (Action<string?>)GetExistingManagedDelegate(block);\n\t\t\t\treturn del ?? new ActionStringTrampolineBlock((BlockLiteral*)block).Invoke;\n\t\t\t}\n\n\t\t\tvoid Invoke(string? obj)\n\t\t\t{\n\t\t\t\tvar nsobj = CFString.CreateNative(obj);\n\t\t\t\tinvoker(BlockPointer, nsobj);\n\t\t\t\tCFString.ReleaseNative(nsobj);\n\t\t\t}\n\t\t}\n\t}\n\n\tinternal class WebViewNavigationDelegate : WKNavigationDelegate\n\t{\n\t\tprivate WeakReference<WKNavigation>? _currentNavigation;\n\t\tprivate Uri? _currentUri;\n\n\t\tpublic override void DidStartProvisionalNavigation(WKWebView webView, WKNavigation navigation)\n\t\t{\n\t\t\t_currentNavigation = new(navigation);\n\t\t}\n\n\t\tpublic override void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action<WKNavigationActionPolicy> decisionHandler)\n\t\t{\n\t\t\tvar requestUrl = navigationAction.Request.Url;\n\t\t\tvar uri = new Uri(requestUrl.ToString());\n\t\t\tbool openExternally = false;\n\n\t\t\t// TargetFrame is null for navigation to a new window (`_blank`)\n\t\t\tif (navigationAction.TargetFrame is null)\n\t\t\t{\n\t\t\t\t// Open in a new browser window regardless of UrlLoadingStrategy\n\t\t\t\topenExternally = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\topenExternally = !BlazorWebView.AppOriginUri.IsBaseOf(uri);\n\t\t\t}\n\n\t\t\tif (openExternally)\n\t\t\t{\n\t\t\t\tUIApplication.SharedApplication.OpenUrl(requestUrl, new UIApplicationOpenUrlOptions(), null);\n\n\t\t\t\t// Cancel any further navigation as we've either opened the link in the external browser\n\t\t\t\t// or canceled the underlying navigation action.\n\t\t\t\tdecisionHandler(WKNavigationActionPolicy.Cancel);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (navigationAction.TargetFrame!.MainFrame)\n\t\t\t{\n\t\t\t\t_currentUri = requestUrl;\n\t\t\t}\n\n\t\t\tdecisionHandler(WKNavigationActionPolicy.Allow);\n\t\t}\n\n\t\tpublic override void DidReceiveServerRedirectForProvisionalNavigation(WKWebView webView, WKNavigation navigation)\n\t\t{\n\t\t\t// We need to intercept the redirects to the app scheme because Safari will block them.\n\t\t\t// We will handle these redirects through the Navigation Manager.\n\t\t\tif (_currentUri?.Host == BlazorWebView.AppHostAddress)\n\t\t\t{\n\t\t\t\tvar uri = _currentUri;\n\t\t\t\t_currentUri = null;\n\t\t\t\t_currentNavigation = null;\n\t\t\t\tif (uri is not null)\n\t\t\t\t{\n\t\t\t\t\tusing var request = new NSUrlRequest(new NSUrl(uri.AbsoluteUri));\n\t\t\t\t\twebView.LoadRequest(request);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic override void DidFailNavigation(WKWebView webView, WKNavigation navigation, NSError error)\n\t\t{\n\t\t\t_currentUri = null;\n\t\t\t_currentNavigation = null;\n\t\t}\n\n\t\tpublic override void DidFailProvisionalNavigation(WKWebView webView, WKNavigation navigation, NSError error)\n\t\t{\n\t\t\t_currentUri = null;\n\t\t\t_currentNavigation = null;\n\t\t}\n\n\t\tpublic override void DidCommitNavigation(WKWebView webView, WKNavigation navigation)\n\t\t{\n\t\t\tif (_currentUri != null && _currentNavigation is not null && _currentNavigation.TryGetTarget(out var nav) && nav == navigation)\n\t\t\t{\n\t\t\t\t// TODO: Determine whether this is needed\n\t\t\t\t//_webView.HandleNavigationStarting(_currentUri);\n\t\t\t}\n\t\t}\n\n\t\tpublic override void DidFinishNavigation(WKWebView webView, WKNavigation navigation)\n\t\t{\n\t\t\tif (_currentUri != null && _currentNavigation is not null && _currentNavigation.TryGetTarget(out var nav) && nav == navigation)\n\t\t\t{\n\t\t\t\t// TODO: Determine whether this is needed\n\t\t\t\t//_webView.HandleNavigationFinished(_currentUri);\n\t\t\t\t_currentUri = null;\n\t\t\t\t_currentNavigation = null;\n\t\t\t}\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/Spice/Platforms/iOS/Border.cs",
    "content": "namespace Spice;\n\npublic partial class Border\n{\n\t/// <summary>\n\t/// Returns border.NativeView\n\t/// </summary>\n\t/// <param name=\"border\">The Spice.Border</param>\n\tpublic static implicit operator UIView(Border border) => border.NativeView;\n\n\t/// <summary>\n\t/// Represents a border around a single child view. Set Content to a View, and customize with Stroke, StrokeThickness, CornerRadius, and Padding.\n\t/// iOS -> UIView with CALayer border\n\t/// </summary>\n\tpublic Border() : base(v => new UIView { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic Border(CGRect frame) : base(v => new UIView(frame) { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected Border(Func<View, UIView> creator) : base(creator) { }\n\n\tNSLayoutConstraint[]? _contentConstraints;\n\n\tpartial void OnContentChanged(View? oldValue, View? newValue)\n\t{\n\t\tif (oldValue != null)\n\t\t{\n\t\t\tConstraintHelper.RemoveConstraints(_contentConstraints);\n\t\t\t_contentConstraints = null;\n\t\t\t((UIView)oldValue).RemoveFromSuperview();\n\t\t}\n\n\t\tif (newValue != null)\n\t\t{\n\t\t\tUIView contentView = newValue;\n\t\t\tNativeView.AddSubview(contentView);\n\t\t\tvar padding = (nfloat)Padding;\n\t\t\t_contentConstraints = ConstraintHelper.PinEdges(contentView, NativeView, padding);\n\t\t}\n\t}\n\n\tpartial void OnStrokeChanged(Color? value)\n\t{\n\t\tif (value != null)\n\t\t{\n\t\t\tNativeView.Layer.BorderColor = value.ToCGColor();\n\t\t\t// Ensure default StrokeThickness is applied to native layer\n\t\t\tNativeView.Layer.BorderWidth = (nfloat)StrokeThickness;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tNativeView.Layer.BorderColor = null;\n\t\t}\n\t}\n\n\tpartial void OnStrokeThicknessChanged(double value)\n\t{\n\t\tNativeView.Layer.BorderWidth = (nfloat)value;\n\t}\n\n\tpartial void OnCornerRadiusChanged(double value)\n\t{\n\t\tNativeView.Layer.CornerRadius = (nfloat)value;\n\t\tNativeView.Layer.MasksToBounds = value > 0;\n\t}\n\n\tpartial void OnPaddingChanged(double value)\n\t{\n\t\tif (_contentConstraints != null)\n\t\t{\n\t\t\tvar padding = (nfloat)value;\n\t\t\tConstraintHelper.UpdateInsets(_contentConstraints, padding);\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Override to handle single child only.\n\t/// Border only supports the Content property for adding a single child view.\n\t/// Use the Content property instead of Children.Add() to set the border's content.\n\t/// </summary>\n\tprotected override void AddSubview(View view)\n\t{\n\t\t// Do nothing - Border doesn't support Children collection\n\t\t// Only Content property should be used to add a view\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/BoxView.cs",
    "content": "namespace Spice;\n\npublic partial class BoxView\n{\n\t/// <summary>\n\t/// Returns boxView.NativeView\n\t/// </summary>\n\t/// <param name=\"boxView\">The Spice.BoxView</param>\n\tpublic static implicit operator UIView(BoxView boxView) => boxView.NativeView;\n\n\t/// <summary>\n\t/// Represents a colored rectangle used for decoration, backgrounds, or dividing lines.\n\t/// Android -> Android.Views.View\n\t/// iOS -> UIKit.UIView\n\t/// </summary>\n\tpublic BoxView() : base(_ => new UIView { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic BoxView(CGRect frame) : base(_ => new UIView(frame) { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected BoxView(Func<View, UIView> creator) : base(creator) { }\n\n\tpartial void OnColorChanged(Color? value) => NativeView.BackgroundColor = value.ToUIColor();\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/Button.cs",
    "content": "﻿namespace Spice;\n\npublic partial class Button\n{\n\t/// <summary>\n\t/// Returns button.NativeView\n\t/// </summary>\n\t/// <param name=\"button\">The Spice.Button</param>\n\tpublic static implicit operator UIButton(Button button) => button.NativeView;\n\n\t/// <summary>\n\t/// You know the button! Use the Clicked event.\n\t/// Android -> Android.Widget.Button\n\t/// iOS -> UIKit.UIButton\n\t/// </summary>\n\tpublic Button() : base(_ => new UIButton { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic Button(CGRect frame) : base(_ => new UIButton(frame) { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected Button(Func<View, UIView> creator) : base(creator) { }\n\n\t/// <summary>\n\t/// The underlying UIKit.UIButton\n\t/// </summary>\n\tpublic new UIButton NativeView => (UIButton)_nativeView.Value;\n\n\tpartial void OnTextChanged(string value)\n\t{\n\t\tNativeView.SetTitle(value, UIControlState.Normal);\n\t\tif (HorizontalOptions.Alignment != LayoutAlignment.Fill && VerticalOptions.Alignment != LayoutAlignment.Fill)\n\t\t{\n\t\t\tNativeView.SizeToFit();\n\t\t}\n\t}\n\n\tpartial void OnTextColorChanged(Color? value) => NativeView.SetTitleColor(value.ToUIColor(), UIControlState.Normal);\n\n\tEventHandler? _click;\n\n\tpartial void OnClickedChanged(Action<Button>? value)\n\t{\n\t\tif (value == null)\n\t\t{\n\t\t\tif (_click != null)\n\t\t\t{\n\t\t\t\tNativeView.TouchUpInside -= _click;\n\t\t\t\t_click = null;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (_click != null)\n\t\t\t\tNativeView.TouchUpInside -= _click;\n\t\t\tNativeView.TouchUpInside += _click = (sender, e) => Clicked?.Invoke(this);\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/Spice/Platforms/iOS/CheckBox.cs",
    "content": "namespace Spice;\n\npublic partial class CheckBox\n{\n\t/// <summary>\n\t/// Returns checkBox.NativeView\n\t/// </summary>\n\t/// <param name=\"checkBox\">The Spice.CheckBox</param>\n\tpublic static implicit operator UIButton(CheckBox checkBox) => checkBox.NativeView;\n\n\t/// <summary>\n\t/// A checkbox control for boolean selection.\n\t/// Android -> Android.Widget.CheckBox\n\t/// iOS -> UIKit.UIButton (with checkmark styling)\n\t/// </summary>\n\tpublic CheckBox() : base(_ => new UIButton(UIButtonType.System) { AutoresizingMask = UIViewAutoresizing.None })\n\t{\n\t\tInitializeCheckBox();\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic CheckBox(CGRect frame) : base(_ =>\n\t{\n\t\tvar button = new UIButton(UIButtonType.System)\n\t\t{\n\t\t\tAutoresizingMask = UIViewAutoresizing.None,\n\t\t\tFrame = frame\n\t\t};\n\t\treturn button;\n\t})\n\t{\n\t\tInitializeCheckBox();\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected CheckBox(Func<View, UIView> creator) : base(creator)\n\t{\n\t\tInitializeCheckBox();\n\t}\n\n\t/// <summary>\n\t/// The underlying UIKit.UIButton\n\t/// </summary>\n\tpublic new UIButton NativeView => (UIButton)_nativeView.Value;\n\n\tvoid InitializeCheckBox()\n\t{\n\t\tNativeView.SetImage(UIImage.GetSystemImage(\"square\"), UIControlState.Normal);\n\t\tNativeView.SetImage(UIImage.GetSystemImage(\"checkmark.square.fill\"), UIControlState.Selected);\n\t\tNativeView.TouchUpInside += OnTouchUpInside;\n\t}\n\n\tpartial void OnIsCheckedChanged(bool value)\n\t{\n\t\tNativeView.Selected = value;\n\t}\n\n\tvoid OnTouchUpInside(object? sender, EventArgs e)\n\t{\n\t\tIsChecked = !IsChecked;\n\t\tCheckedChanged?.Invoke(this);\n\t}\n\n\tpartial void OnCheckedChangedChanged(Action<CheckBox>? value)\n\t{\n\t\t// Event subscription is handled in InitializeCheckBox\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/CollectionView.cs",
    "content": "using System.Collections;\nusing System.Collections.Specialized;\n\nnamespace Spice;\n\npublic partial class CollectionView\n{\n\t/// <summary>\n\t/// Returns collectionView.NativeView\n\t/// </summary>\n\t/// <param name=\"collectionView\">The Spice.CollectionView</param>\n\tpublic static implicit operator UICollectionView(CollectionView collectionView) => collectionView.NativeView;\n\n\t/// <summary>\n\t/// A view for presenting collections of data using a lambda-based item template.\n\t/// Android -> AndroidX.RecyclerView.Widget.RecyclerView\n\t/// iOS -> UIKit.UICollectionView\n\t/// </summary>\n\tpublic CollectionView() : base(v => new SpiceCollectionView((CollectionView)v) { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected CollectionView(Func<View, UIView> creator) : base(creator) { }\n\n\t/// <summary>\n\t/// The underlying UICollectionView\n\t/// </summary>\n\tpublic new UICollectionView NativeView => (UICollectionView)_nativeView.Value;\n\n\tSpiceCollectionViewDataSource? _dataSource;\n\tSpiceCollectionViewDelegate? _delegate;\n\tINotifyCollectionChanged? _observableCollection;\n\n\tpartial void OnItemsSourceChanged(IEnumerable? value)\n\t{\n\t\t// Unsubscribe from old collection\n\t\tif (_observableCollection != null)\n\t\t{\n\t\t\t_observableCollection.CollectionChanged -= OnCollectionChanged;\n\t\t\t_observableCollection = null;\n\t\t}\n\n\t\t// Subscribe to new collection if it's observable\n\t\tif (value is INotifyCollectionChanged observable)\n\t\t{\n\t\t\t_observableCollection = observable;\n\t\t\tobservable.CollectionChanged += OnCollectionChanged;\n\t\t}\n\n\t\tRefreshData();\n\t}\n\n\tpartial void OnItemTemplateChanged(Func<object, View>? value)\n\t{\n\t\tRefreshData();\n\t}\n\n\tpartial void OnOrientationChanged(Orientation value)\n\t{\n\t\tif (!_nativeView.IsValueCreated)\n\t\t\treturn;\n\n\t\tvar layout = (UICollectionViewFlowLayout)NativeView.CollectionViewLayout;\n\t\tlayout.ScrollDirection = value == Orientation.Horizontal\n\t\t\t? UICollectionViewScrollDirection.Horizontal\n\t\t\t: UICollectionViewScrollDirection.Vertical;\n\n\t\tRefreshData();\n\t}\n\n\tpartial void OnSelectionModeChanged(SelectionMode value)\n\t{\n\t\tif (!_nativeView.IsValueCreated)\n\t\t\treturn;\n\n\t\tNativeView.AllowsSelection = value != SelectionMode.None;\n\t\tNativeView.AllowsMultipleSelection = value == SelectionMode.Multiple;\n\t}\n\n\tpartial void OnSelectedItemChanged(object? value)\n\t{\n\t\tif (!_nativeView.IsValueCreated)\n\t\t\treturn;\n\n\t\t// When SelectedItem is set to null, clear native selection\n\t\tif (value == null)\n\t\t{\n\t\t\tvar selectedIndexPaths = NativeView.GetIndexPathsForSelectedItems();\n\t\t\tif (selectedIndexPaths != null)\n\t\t\t{\n\t\t\t\tforeach (var indexPath in selectedIndexPaths)\n\t\t\t\t\tNativeView.DeselectItem(indexPath, false);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (_dataSource != null)\n\t\t{\n\t\t\t// Use cached items for O(1) lookup\n\t\t\tint index = _dataSource._itemsCache.IndexOf(value);\n\t\t\tif (index >= 0)\n\t\t\t{\n\t\t\t\tvar indexPath = NSIndexPath.FromRowSection(index, 0);\n\t\t\t\tNativeView.SelectItem(indexPath, false, UICollectionViewScrollPosition.None);\n\t\t\t}\n\t\t}\n\t}\n\n\tpartial void OnItemSpacingChanged(double value)\n\t{\n\t\tif (!_nativeView.IsValueCreated)\n\t\t\treturn;\n\n\t\tvar layout = (UICollectionViewFlowLayout)NativeView.CollectionViewLayout;\n\t\tlayout.MinimumLineSpacing = (nfloat)value;\n\t\tlayout.MinimumInteritemSpacing = (nfloat)value;\n\t}\n\n\tvoid OnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)\n\t{\n\t\tRefreshData();\n\t}\n\n\tvoid RefreshData()\n\t{\n\t\tif (!_nativeView.IsValueCreated)\n\t\t\treturn;\n\n\t\tif (_dataSource != null)\n\t\t\t_dataSource.UpdateItemsCache(this);\n\n\t\tNativeView.ReloadData();\n\t}\n\n\tclass SpiceCollectionView : UICollectionView\n\t{\n\t\treadonly WeakReference<CollectionView> _parentRef;\n\n\t\tpublic SpiceCollectionView(CollectionView parent) : base(CGRect.Empty, new UICollectionViewFlowLayout\n\t\t{\n\t\t\tScrollDirection = UICollectionViewScrollDirection.Vertical,\n\t\t\tMinimumLineSpacing = 0,\n\t\t\tMinimumInteritemSpacing = 0\n\t\t})\n\t\t{\n\t\t\t_parentRef = new WeakReference<CollectionView>(parent);\n\t\t\tRegisterClassForCell(typeof(SpiceCollectionViewCell), \"SpiceCell\");\n\n\t\t\tparent._dataSource = new SpiceCollectionViewDataSource(parent);\n\t\t\tparent._delegate = new SpiceCollectionViewDelegate(parent);\n\t\t\tDataSource = parent._dataSource;\n\t\t\tDelegate = parent._delegate;\n\n\t\t\tBackgroundColor = UIColor.Clear;\n\t\t}\n\t}\n\n\tclass SpiceCollectionViewDataSource : UICollectionViewDataSource\n\t{\n\t\treadonly WeakReference<CollectionView> _parentRef;\n\t\tinternal List<object> _itemsCache = new();\n\n\t\tpublic SpiceCollectionViewDataSource(CollectionView parent)\n\t\t{\n\t\t\t_parentRef = new WeakReference<CollectionView>(parent);\n\t\t\tUpdateItemsCache(parent);\n\t\t}\n\n\t\tpublic void UpdateItemsCache(CollectionView parent)\n\t\t{\n\t\t\t_itemsCache.Clear();\n\t\t\tif (parent.ItemsSource != null)\n\t\t\t{\n\t\t\t\tforeach (var item in parent.ItemsSource)\n\t\t\t\t\t_itemsCache.Add(item);\n\t\t\t}\n\t\t}\n\n\t\tpublic override nint GetItemsCount(UICollectionView collectionView, nint section)\n\t\t{\n\t\t\treturn _itemsCache.Count;\n\t\t}\n\n\t\tpublic override UICollectionViewCell GetCell(UICollectionView collectionView, NSIndexPath indexPath)\n\t\t{\n\t\t\tvar cell = (SpiceCollectionViewCell)collectionView.DequeueReusableCell(\"SpiceCell\", indexPath);\n\n\t\t\tif (!_parentRef.TryGetTarget(out var parent) || parent.ItemTemplate == null)\n\t\t\t\treturn cell;\n\n\t\t\t// Get the item at this index from cache\n\t\t\tif (indexPath.Row >= 0 && indexPath.Row < _itemsCache.Count)\n\t\t\t{\n\t\t\t\tvar item = _itemsCache[(int)indexPath.Row];\n\n\t\t\t\t// Clear existing content\n\t\t\t\tforeach (var subview in cell.ContentView.Subviews)\n\t\t\t\t\tsubview.RemoveFromSuperview();\n\n\t\t\t\t// Create and add the view\n\t\t\t\tvar view = parent.CreateItemView(item);\n\t\t\t\tcell.ContentView.AddSubview(view);\n\t\t\t\tview.UpdateAlign();\n\t\t\t}\n\n\t\t\treturn cell;\n\t\t}\n\t}\n\n\tclass SpiceCollectionViewDelegate : UICollectionViewDelegateFlowLayout\n\t{\n\t\treadonly WeakReference<CollectionView> _parentRef;\n\n\t\tpublic SpiceCollectionViewDelegate(CollectionView parent)\n\t\t{\n\t\t\t_parentRef = new WeakReference<CollectionView>(parent);\n\t\t}\n\n\t\tpublic override CGSize GetSizeForItem(UICollectionView collectionView, UICollectionViewLayout layout, NSIndexPath indexPath)\n\t\t{\n\t\t\tif (!_parentRef.TryGetTarget(out var parent))\n\t\t\t\treturn new CGSize(100, 44);\n\n\t\t\tif (layout is not UICollectionViewFlowLayout)\n\t\t\t\treturn new CGSize(100, 44);\n\t\t\t\n\t\t\tif (parent.Orientation == Orientation.Horizontal)\n\t\t\t{\n\t\t\t\t// Horizontal: full height, width determined by content\n\t\t\t\treturn new CGSize(100, collectionView.Frame.Height);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Vertical: full width, height determined by content\n\t\t\t\treturn new CGSize(collectionView.Frame.Width, 44);\n\t\t\t}\n\t\t}\n\n\t\tpublic override void ItemSelected(UICollectionView collectionView, NSIndexPath indexPath)\n\t\t{\n\t\t\tif (!_parentRef.TryGetTarget(out var parent) || parent.SelectionMode == SelectionMode.None)\n\t\t\t\treturn;\n\n\t\t\t// Get the item at this index from data source cache\n\t\t\tvar dataSource = collectionView.DataSource as SpiceCollectionViewDataSource;\n\t\t\tif (dataSource != null && indexPath.Row >= 0 && indexPath.Row < dataSource._itemsCache.Count)\n\t\t\t{\n\t\t\t\tvar item = dataSource._itemsCache[(int)indexPath.Row];\n\t\t\t\t\n\t\t\t\tif (parent.SelectionMode == SelectionMode.Single)\n\t\t\t\t{\n\t\t\t\t\tparent.SelectedItem = item;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tclass SpiceCollectionViewCell : UICollectionViewCell\n\t{\n\t\tpublic SpiceCollectionViewCell(IntPtr handle) : base(handle) { }\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/ConstraintHelper.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// Internal helper for managing UIKit Auto Layout constraints.\n/// Provides utilities to pin edges, center views, and set sizes using constraints.\n/// </summary>\nstatic class ConstraintHelper\n{\n\t/// <summary>\n\t/// Pins a child view to its parent on all four edges with the given insets.\n\t/// The child's TranslatesAutoresizingMaskIntoConstraints is set to false.\n\t/// Returns the four constraints (leading, trailing, top, bottom) for later updates.\n\t/// </summary>\n\tpublic static NSLayoutConstraint[] PinEdges(UIView child, UIView parent, nfloat top, nfloat leading, nfloat bottom, nfloat trailing)\n\t{\n\t\tchild.TranslatesAutoresizingMaskIntoConstraints = false;\n\n\t\tvar constraints = new[]\n\t\t{\n\t\t\tchild.LeadingAnchor.ConstraintEqualTo(parent.LeadingAnchor, leading),\n\t\t\tparent.TrailingAnchor.ConstraintEqualTo(child.TrailingAnchor, trailing),\n\t\t\tchild.TopAnchor.ConstraintEqualTo(parent.TopAnchor, top),\n\t\t\tparent.BottomAnchor.ConstraintEqualTo(child.BottomAnchor, bottom),\n\t\t};\n\n\t\tNSLayoutConstraint.ActivateConstraints(constraints);\n\t\treturn constraints;\n\t}\n\n\t/// <summary>\n\t/// Pins a child view to its parent on all four edges with uniform inset.\n\t/// </summary>\n\tpublic static NSLayoutConstraint[] PinEdges(UIView child, UIView parent, nfloat inset = default)\n\t{\n\t\treturn PinEdges(child, parent, inset, inset, inset, inset);\n\t}\n\n\t/// <summary>\n\t/// Updates the constants of an existing set of edge constraints (leading, trailing, top, bottom)\n\t/// returned by <see cref=\"PinEdges(UIView, UIView, nfloat, nfloat, nfloat, nfloat)\"/>.\n\t/// </summary>\n\tpublic static void UpdateInsets(NSLayoutConstraint[] constraints, nfloat top, nfloat leading, nfloat bottom, nfloat trailing)\n\t{\n\t\tif (constraints.Length != 4)\n\t\t\treturn;\n\n\t\tconstraints[0].Constant = leading;   // leading\n\t\tconstraints[1].Constant = trailing;  // trailing\n\t\tconstraints[2].Constant = top;       // top\n\t\tconstraints[3].Constant = bottom;    // bottom\n\t}\n\n\t/// <summary>\n\t/// Updates the constants of an existing set of edge constraints with uniform inset.\n\t/// </summary>\n\tpublic static void UpdateInsets(NSLayoutConstraint[] constraints, nfloat inset)\n\t{\n\t\tUpdateInsets(constraints, inset, inset, inset, inset);\n\t}\n\n\t/// <summary>\n\t/// Removes and deactivates a set of constraints.\n\t/// </summary>\n\tpublic static void RemoveConstraints(NSLayoutConstraint[]? constraints)\n\t{\n\t\tif (constraints == null)\n\t\t\treturn;\n\n\t\tNSLayoutConstraint.DeactivateConstraints(constraints);\n\t}\n\n\t/// <summary>\n\t/// Applies alignment constraints to a child view within a parent based on Spice layout options,\n\t/// margin, and size requests. Returns the active constraints for later removal/update.\n\t/// </summary>\n\tpublic static NSLayoutConstraint[] ApplyAlignment(\n\t\tUIView child,\n\t\tUIView parent,\n\t\tLayoutAlignment horizontalAlignment,\n\t\tLayoutAlignment verticalAlignment,\n\t\tThickness margin,\n\t\tdouble widthRequest,\n\t\tdouble heightRequest)\n\t{\n\t\tchild.TranslatesAutoresizingMaskIntoConstraints = false;\n\n\t\tvar constraints = new List<NSLayoutConstraint>();\n\n\t\tvar marginLeft = (nfloat)margin.Left;\n\t\tvar marginTop = (nfloat)margin.Top;\n\t\tvar marginRight = (nfloat)margin.Right;\n\t\tvar marginBottom = (nfloat)margin.Bottom;\n\n\t\t// Horizontal\n\t\tswitch (horizontalAlignment)\n\t\t{\n\t\t\tcase LayoutAlignment.Fill:\n\t\t\t\tif (widthRequest >= 0)\n\t\t\t\t{\n\t\t\t\t\tconstraints.Add(child.LeadingAnchor.ConstraintEqualTo(parent.LeadingAnchor, marginLeft));\n\t\t\t\t\tconstraints.Add(child.WidthAnchor.ConstraintEqualTo((nfloat)widthRequest));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconstraints.Add(child.LeadingAnchor.ConstraintEqualTo(parent.LeadingAnchor, marginLeft));\n\t\t\t\t\tconstraints.Add(parent.TrailingAnchor.ConstraintEqualTo(child.TrailingAnchor, marginRight));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase LayoutAlignment.Center:\n\t\t\t\tif (widthRequest >= 0)\n\t\t\t\t{\n\t\t\t\t\tconstraints.Add(child.CenterXAnchor.ConstraintEqualTo(parent.CenterXAnchor, (marginLeft - marginRight) / 2));\n\t\t\t\t\tconstraints.Add(child.WidthAnchor.ConstraintEqualTo((nfloat)widthRequest));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Without an explicit width, anchor to both leading and trailing to avoid ambiguous width.\n\t\t\t\t\tconstraints.Add(child.LeadingAnchor.ConstraintEqualTo(parent.LeadingAnchor, marginLeft));\n\t\t\t\t\tconstraints.Add(parent.TrailingAnchor.ConstraintEqualTo(child.TrailingAnchor, marginRight));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase LayoutAlignment.Start:\n\t\t\t\tconstraints.Add(child.LeadingAnchor.ConstraintEqualTo(parent.LeadingAnchor, marginLeft));\n\t\t\t\tif (widthRequest >= 0)\n\t\t\t\t{\n\t\t\t\t\tconstraints.Add(child.WidthAnchor.ConstraintEqualTo((nfloat)widthRequest));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Derive width from parent when no explicit width is requested.\n\t\t\t\t\tconstraints.Add(parent.TrailingAnchor.ConstraintEqualTo(child.TrailingAnchor, marginRight));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase LayoutAlignment.End:\n\t\t\t\tconstraints.Add(parent.TrailingAnchor.ConstraintEqualTo(child.TrailingAnchor, marginRight));\n\t\t\t\tif (widthRequest >= 0)\n\t\t\t\t{\n\t\t\t\t\tconstraints.Add(child.WidthAnchor.ConstraintEqualTo((nfloat)widthRequest));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Derive width from parent when no explicit width is requested.\n\t\t\t\t\tconstraints.Add(child.LeadingAnchor.ConstraintEqualTo(parent.LeadingAnchor, marginLeft));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Vertical\n\t\tswitch (verticalAlignment)\n\t\t{\n\t\t\tcase LayoutAlignment.Fill:\n\t\t\t\tif (heightRequest >= 0)\n\t\t\t\t{\n\t\t\t\t\tconstraints.Add(child.TopAnchor.ConstraintEqualTo(parent.TopAnchor, marginTop));\n\t\t\t\t\tconstraints.Add(child.HeightAnchor.ConstraintEqualTo((nfloat)heightRequest));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconstraints.Add(child.TopAnchor.ConstraintEqualTo(parent.TopAnchor, marginTop));\n\t\t\t\t\tconstraints.Add(parent.BottomAnchor.ConstraintEqualTo(child.BottomAnchor, marginBottom));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase LayoutAlignment.Center:\n\t\t\t\tif (heightRequest >= 0)\n\t\t\t\t{\n\t\t\t\t\tconstraints.Add(child.CenterYAnchor.ConstraintEqualTo(parent.CenterYAnchor, (marginTop - marginBottom) / 2));\n\t\t\t\t\tconstraints.Add(child.HeightAnchor.ConstraintEqualTo((nfloat)heightRequest));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Without an explicit height, anchor to both top and bottom to avoid ambiguous height.\n\t\t\t\t\tconstraints.Add(child.TopAnchor.ConstraintEqualTo(parent.TopAnchor, marginTop));\n\t\t\t\t\tconstraints.Add(parent.BottomAnchor.ConstraintEqualTo(child.BottomAnchor, marginBottom));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase LayoutAlignment.Start:\n\t\t\t\tconstraints.Add(child.TopAnchor.ConstraintEqualTo(parent.TopAnchor, marginTop));\n\t\t\t\tif (heightRequest >= 0)\n\t\t\t\t{\n\t\t\t\t\tconstraints.Add(child.HeightAnchor.ConstraintEqualTo((nfloat)heightRequest));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Derive height from parent when no explicit height is requested.\n\t\t\t\t\tconstraints.Add(parent.BottomAnchor.ConstraintEqualTo(child.BottomAnchor, marginBottom));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase LayoutAlignment.End:\n\t\t\t\tconstraints.Add(parent.BottomAnchor.ConstraintEqualTo(child.BottomAnchor, marginBottom));\n\t\t\t\tif (heightRequest >= 0)\n\t\t\t\t{\n\t\t\t\t\tconstraints.Add(child.HeightAnchor.ConstraintEqualTo((nfloat)heightRequest));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Derive height from parent when no explicit height is requested.\n\t\t\t\t\tconstraints.Add(child.TopAnchor.ConstraintEqualTo(parent.TopAnchor, marginTop));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tvar result = constraints.ToArray();\n\t\tNSLayoutConstraint.ActivateConstraints(result);\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/ContentView.cs",
    "content": "namespace Spice;\n\npublic partial class ContentView\n{\n\t/// <summary>\n\t/// Returns contentView.NativeView\n\t/// </summary>\n\t/// <param name=\"contentView\">The Spice.ContentView</param>\n\tpublic static implicit operator UIView(ContentView contentView) => contentView.NativeView;\n\n\t/// <summary>\n\t/// A container view that holds a single child view via the Content property.\n\t/// Android -> Android.Views.ViewGroup (FrameLayout)\n\t/// iOS -> UIKit.UIView\n\t/// </summary>\n\tpublic ContentView() : base(v => new UIView { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic ContentView(CGRect frame) : base(v => new UIView(frame) { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected ContentView(Func<View, UIView> creator) : base(creator) { }\n\n\tNSLayoutConstraint[]? _contentConstraints;\n\n\tpartial void OnContentChanged(View? oldContent, View? newContent)\n\t{\n\t\t// Remove old content\n\t\tif (oldContent != null)\n\t\t{\n\t\t\tConstraintHelper.RemoveConstraints(_contentConstraints);\n\t\t\t_contentConstraints = null;\n\t\t\t((UIView)oldContent).RemoveFromSuperview();\n\t\t}\n\n\t\t// Add new content\n\t\tif (newContent != null)\n\t\t{\n\t\t\tUIView contentView = newContent;\n\t\t\tNativeView.AddSubview(contentView);\n\t\t\tvar padding = (nfloat)Padding;\n\t\t\t_contentConstraints = ConstraintHelper.PinEdges(contentView, NativeView, padding);\n\t\t}\n\t}\n\n\tpartial void OnPaddingChanged(double value)\n\t{\n\t\tif (_contentConstraints != null)\n\t\t{\n\t\t\tvar padding = (nfloat)value;\n\t\t\tConstraintHelper.UpdateInsets(_contentConstraints, padding);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/DatePicker.cs",
    "content": "namespace Spice;\n\npublic partial class DatePicker\n{\n\t/// <summary>\n\t/// Returns datePicker.NativeView\n\t/// </summary>\n\t/// <param name=\"datePicker\">The Spice.DatePicker</param>\n\tpublic static implicit operator UIDatePicker(DatePicker datePicker) => datePicker.NativeView;\n\n\t/// <summary>\n\t/// Control for date selection.\n\t/// Android -> Android.App.DatePickerDialog\n\t/// iOS -> UIKit.UIDatePicker\n\t/// </summary>\n\tpublic DatePicker() : base(_ => new UIDatePicker\n\t{\n\t\tAutoresizingMask = UIViewAutoresizing.None,\n\t\tMode = UIDatePickerMode.Date,\n\t\tPreferredDatePickerStyle = UIDatePickerStyle.Compact\n\t})\n\t{\n\t\tNativeView.ValueChanged += OnValueChanged;\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic DatePicker(CGRect frame) : base(_ => new UIDatePicker(frame)\n\t{\n\t\tAutoresizingMask = UIViewAutoresizing.None,\n\t\tMode = UIDatePickerMode.Date,\n\t\tPreferredDatePickerStyle = UIDatePickerStyle.Compact\n\t})\n\t{\n\t\tNativeView.ValueChanged += OnValueChanged;\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected DatePicker(Func<View, UIView> creator) : base(creator) { }\n\n\t/// <summary>\n\t/// The underlying UIDatePicker\n\t/// </summary>\n\tpublic new UIDatePicker NativeView => (UIDatePicker)_nativeView.Value;\n\n\tvoid OnValueChanged(object? sender, EventArgs e)\n\t{\n\t\tDate = NativeView.Date.ToDateTime().Date;\n\t}\n\n\tpartial void OnDateChanged(DateTime value)\n\t{\n\t\tvar dateOnly = value.Date;\n\n\t\t// Clamp to min/max if configured\n\t\tif (MinimumDate.HasValue && dateOnly < MinimumDate.Value.Date)\n\t\t\tdateOnly = MinimumDate.Value.Date;\n\t\tif (MaximumDate.HasValue && dateOnly > MaximumDate.Value.Date)\n\t\t\tdateOnly = MaximumDate.Value.Date;\n\n\t\tif (dateOnly != value)\n\t\t\t_date = dateOnly;\n\n\t\tNativeView.Date = dateOnly.ToNSDate();\n\t}\n\n\tpartial void OnMinimumDateChanged(DateTime? value)\n\t{\n\t\tif (value.HasValue)\n\t\t{\n\t\t\tvar minDate = value.Value.Date;\n\t\t\tNativeView.MinimumDate = minDate.ToNSDate();\n\n\t\t\t// UIDatePicker may silently adjust Date; keep managed property in sync\n\t\t\tif (Date < minDate)\n\t\t\t\tDate = minDate;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tNativeView.MinimumDate = null;\n\t\t}\n\t}\n\n\tpartial void OnMaximumDateChanged(DateTime? value)\n\t{\n\t\tif (value.HasValue)\n\t\t{\n\t\t\tvar maxDate = value.Value.Date;\n\t\t\tNativeView.MaximumDate = maxDate.ToNSDate();\n\n\t\t\t// UIDatePicker may silently adjust Date; keep managed property in sync\n\t\t\tif (Date > maxDate)\n\t\t\t\tDate = maxDate;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tNativeView.MaximumDate = null;\n\t\t}\n\t}\n\n\tpartial void OnTextColorChanged(Color? value)\n\t{\n\t\t// UIDatePicker doesn't have a direct text color property in compact style\n\t\t// The color is controlled by the system theme\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/Editor.cs",
    "content": "namespace Spice;\n\npublic partial class Editor\n{\n\t/// <summary>\n\t/// Returns editor.NativeView\n\t/// </summary>\n\t/// <param name=\"editor\">The Spice.Editor</param>\n\tpublic static implicit operator UITextView(Editor editor) => editor.NativeView;\n\n\t/// <summary>\n\t/// Control for multi-line text input.\n\t/// Android -> Android.Widget.EditText (multiline)\n\t/// iOS -> UIKit.UITextView\n\t/// </summary>\n\tpublic Editor() : base(_ => new UITextView { AutoresizingMask = UIViewAutoresizing.None })\n\t{\n\t\tEnsureDelegate();\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic Editor(CGRect frame) : base(_ => new UITextView(frame) { AutoresizingMask = UIViewAutoresizing.None })\n\t{\n\t\tEnsureDelegate();\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected Editor(Func<View, UIView> creator) : base(creator) { }\n\n\t/// <summary>\n\t/// The underlying UITextView\n\t/// </summary>\n\tpublic new UITextView NativeView => (UITextView)_nativeView.Value;\n\n\tpartial void OnTextChanged(string value)\n\t{\n\t\tif (NativeView.Text != value)\n\t\t\tNativeView.Text = value;\n\t}\n\n\tpartial void OnTextColorChanged(Color? value) => NativeView.TextColor = value.ToUIColor();\n\n\tpartial void OnPlaceholderChanged(string? value)\n\t{\n\t\t// UITextView doesn't have native placeholder support; no-op on iOS\n\t}\n\n\tpartial void OnPlaceholderColorChanged(Color? value)\n\t{\n\t\t// UITextView doesn't have native placeholder support; no-op on iOS\n\t}\n\n\tpartial void OnAutoSizeChanged(bool value)\n\t{\n\t\t// Auto-sizing would require observing content size changes\n\t\t// For minimal implementation, we'll skip this for now\n\t}\n\n\tEditorDelegate? _delegate;\n\n\tvoid EnsureDelegate()\n\t{\n\t\tif (_delegate == null)\n\t\t{\n\t\t\t_delegate = new EditorDelegate(this);\n\t\t\tNativeView.Delegate = _delegate;\n\t\t}\n\t}\n\n\tclass EditorDelegate : UITextViewDelegate\n\t{\n\t\treadonly WeakReference<Editor> _editor;\n\n\t\tpublic EditorDelegate(Editor editor)\n\t\t{\n\t\t\t_editor = new WeakReference<Editor>(editor);\n\t\t}\n\n\t\tpublic override void Changed(UITextView textView)\n\t\t{\n\t\t\tif (_editor.TryGetTarget(out var editor))\n\t\t\t{\n\t\t\t\teditor.Text = textView.Text ?? \"\";\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/Entry.cs",
    "content": "﻿namespace Spice;\n\npublic partial class Entry\n{\n\t/// <summary>\n\t/// Returns entry.NativeView\n\t/// </summary>\n\t/// <param name=\"entry\">The Spice.Entry</param>\n\tpublic static implicit operator UITextField(Entry entry) => entry.NativeView;\n\n\t/// <summary>\n\t/// Control for text input, like a form field.\n\t/// Android -> Android.Widget.EditText\n\t/// iOS -> UIKit.UITextField\n\t/// </summary>\n\tpublic Entry() : base(_ => new UITextField { AutoresizingMask = UIViewAutoresizing.None, BorderStyle = UITextBorderStyle.RoundedRect }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic Entry(CGRect frame) : base(_ => new UITextField(frame) { AutoresizingMask = UIViewAutoresizing.None, BorderStyle = UITextBorderStyle.RoundedRect }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected Entry(Func<View, UIView> creator) : base(creator) { }\n\n\t/// <summary>\n\t/// The underlying UITextField\n\t/// </summary>\n\tpublic new UITextField NativeView => (UITextField)_nativeView.Value;\n\n\tpartial void OnTextChanged(string value) => NativeView.Text = value;\n\n\tpartial void OnTextColorChanged(Color? value) => NativeView.TextColor = value.ToUIColor();\n\n\tpartial void OnIsPasswordChanged(bool value) => NativeView.SecureTextEntry = value;\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/Grid.cs",
    "content": "using System.Collections.Specialized;\n\nnamespace Spice;\n\npublic partial class Grid\n{\n\t/// <summary>\n\t/// Returns grid.NativeView\n\t/// </summary>\n\t/// <param name=\"grid\">The Spice.Grid</param>\n\tpublic static implicit operator UIView(Grid grid) => grid.NativeView;\n\n\t/// <summary>\n\t/// A layout container that arranges child views in rows and columns.\n\t/// iOS -> Custom constraint-based layout\n\t/// </summary>\n\tpublic Grid() : this(v => new SpiceGridView((Grid)v) { AutoresizingMask = UIViewAutoresizing.None })\n\t{\n\t\tRowDefinitions.CollectionChanged += OnDefinitionsChanged;\n\t\tColumnDefinitions.CollectionChanged += OnDefinitionsChanged;\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic Grid(CGRect frame) : this(v => new SpiceGridView((Grid)v, frame) { AutoresizingMask = UIViewAutoresizing.None })\n\t{\n\t\tRowDefinitions.CollectionChanged += OnDefinitionsChanged;\n\t\tColumnDefinitions.CollectionChanged += OnDefinitionsChanged;\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected Grid(Func<View, UIView> creator) : base(creator) { }\n\n\t/// <summary>\n\t/// The underlying UIView\n\t/// </summary>\n\tpublic new SpiceGridView NativeView => (SpiceGridView)_nativeView.Value;\n\n\tpartial void OnRowSpacingChanged(double value) => NativeView.InvalidateLayout();\n\n\tpartial void OnColumnSpacingChanged(double value) => NativeView.InvalidateLayout();\n\n\tpartial void OnPaddingChanged(double value) => NativeView.InvalidateLayout();\n\n\tvoid OnDefinitionsChanged(object? sender, NotifyCollectionChangedEventArgs e)\n\t{\n\t\tNativeView.InvalidateLayout();\n\t}\n\n\t/// <inheritdoc />\n\tprotected override void AddSubview(View view)\n\t{\n\t\tNativeView.AddSubview(view);\n\t\tNativeView.InvalidateLayout();\n\t}\n\n\t/// <summary>\n\t/// Custom UIView for Grid layout using manual layout\n\t/// </summary>\n\tpublic class SpiceGridView : UIView\n\t{\n\t\treadonly Grid _parent;\n\n\t\t/// <summary>\n\t\t/// Creates a new SpiceGridView for the specified Grid.\n\t\t/// </summary>\n\t\tpublic SpiceGridView(Grid parent) => _parent = parent;\n\n\t\t/// <summary>\n\t\t/// Creates a new SpiceGridView for the specified Grid with the given frame.\n\t\t/// </summary>\n\t\tpublic SpiceGridView(Grid parent, CGRect frame) : base(frame) => _parent = parent;\n\n\t\t/// <summary>\n\t\t/// Invalidates the layout, causing it to be recalculated on the next layout pass.\n\t\t/// </summary>\n\t\tpublic void InvalidateLayout()\n\t\t{\n\t\t\tSetNeedsLayout();\n\t\t}\n\n\t\t/// <inheritdoc />\n\t\tpublic override void LayoutSubviews()\n\t\t{\n\t\t\tbase.LayoutSubviews();\n\n\t\t\tif (Subviews.Length == 0)\n\t\t\t\treturn;\n\n\t\t\t// Calculate grid dimensions\n\t\t\tint rowCount = Math.Max(1, _parent.RowDefinitions.Count);\n\t\t\tint colCount = Math.Max(1, _parent.ColumnDefinitions.Count);\n\n\t\t\t// Ensure we have enough rows/columns for all children\n\t\t\tforeach (UIView subview in Subviews)\n\t\t\t{\n\t\t\t\tvar spiceView = _parent.Children.FirstOrDefault(v => ((UIView)v).Handle == subview.Handle);\n\t\t\t\tif (spiceView == null)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tint row = GetRow(spiceView);\n\t\t\t\tint col = GetColumn(spiceView);\n\t\t\t\tint rowSpan = GetRowSpan(spiceView);\n\t\t\t\tint colSpan = GetColumnSpan(spiceView);\n\n\t\t\t\trowCount = Math.Max(rowCount, row + rowSpan);\n\t\t\t\tcolCount = Math.Max(colCount, col + colSpan);\n\t\t\t}\n\n\t\t\t// Calculate row heights and column widths\n\t\t\tvar rowHeights = new nfloat[rowCount];\n\t\t\tvar colWidths = new nfloat[colCount];\n\t\t\tvar rowPositions = new nfloat[rowCount];\n\t\t\tvar colPositions = new nfloat[colCount];\n\n\t\t\t// Calculate absolute and auto sizes first\n\t\t\tnfloat totalStarRowWeight = 0;\n\t\t\tnfloat totalStarColWeight = 0;\n\t\t\tnfloat usedHeight = 0;\n\t\t\tnfloat usedWidth = 0;\n\n\t\t\tfor (int i = 0; i < rowCount; i++)\n\t\t\t{\n\t\t\t\tvar rowDef = i < _parent.RowDefinitions.Count ? _parent.RowDefinitions[i] : new RowDefinition();\n\t\t\t\tif (rowDef.Height.IsAbsolute)\n\t\t\t\t{\n\t\t\t\t\trowHeights[i] = (nfloat)rowDef.Height.Value;\n\t\t\t\t\tusedHeight += rowHeights[i];\n\t\t\t\t}\n\t\t\t\telse if (rowDef.Height.IsStar)\n\t\t\t\t{\n\t\t\t\t\ttotalStarRowWeight += (nfloat)rowDef.Height.Value;\n\t\t\t\t}\n\t\t\t\telse if (rowDef.Height.IsAuto)\n\t\t\t\t{\n\t\t\t\t\t// Auto behaves as Star with weight 1\n\t\t\t\t\ttotalStarRowWeight += 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (int i = 0; i < colCount; i++)\n\t\t\t{\n\t\t\t\tvar colDef = i < _parent.ColumnDefinitions.Count ? _parent.ColumnDefinitions[i] : new ColumnDefinition();\n\t\t\t\tif (colDef.Width.IsAbsolute)\n\t\t\t\t{\n\t\t\t\t\tcolWidths[i] = (nfloat)colDef.Width.Value;\n\t\t\t\t\tusedWidth += colWidths[i];\n\t\t\t\t}\n\t\t\t\telse if (colDef.Width.IsStar)\n\t\t\t\t{\n\t\t\t\t\ttotalStarColWeight += (nfloat)colDef.Width.Value;\n\t\t\t\t}\n\t\t\t\telse if (colDef.Width.IsAuto)\n\t\t\t\t{\n\t\t\t\t\t// Auto behaves as Star with weight 1\n\t\t\t\t\ttotalStarColWeight += 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add spacing to used dimensions\n\t\t\tusedHeight += (nfloat)_parent.RowSpacing * (rowCount - 1);\n\t\t\tusedWidth += (nfloat)_parent.ColumnSpacing * (colCount - 1);\n\n\t\t\t// Account for padding\n\t\t\tvar padding = (nfloat)_parent.Padding;\n\t\t\tvar paddingWidth = padding * 2;\n\t\t\tvar paddingHeight = padding * 2;\n\t\t\tusedHeight += paddingHeight;\n\t\t\tusedWidth += paddingWidth;\n\n\t\t\t// Distribute remaining space to star-sized rows/columns\n\t\t\tnfloat remainingHeight = (nfloat)Math.Max(0, Bounds.Height - usedHeight);\n\t\t\tnfloat remainingWidth = (nfloat)Math.Max(0, Bounds.Width - usedWidth);\n\n\t\t\tfor (int i = 0; i < rowCount; i++)\n\t\t\t{\n\t\t\t\tvar rowDef = i < _parent.RowDefinitions.Count ? _parent.RowDefinitions[i] : new RowDefinition();\n\t\t\t\tif ((rowDef.Height.IsStar || rowDef.Height.IsAuto) && totalStarRowWeight > 0)\n\t\t\t\t{\n\t\t\t\t\tvar weight = rowDef.Height.IsAuto ? 1 : (nfloat)rowDef.Height.Value;\n\t\t\t\t\trowHeights[i] = remainingHeight * (weight / totalStarRowWeight);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (int i = 0; i < colCount; i++)\n\t\t\t{\n\t\t\t\tvar colDef = i < _parent.ColumnDefinitions.Count ? _parent.ColumnDefinitions[i] : new ColumnDefinition();\n\t\t\t\tif ((colDef.Width.IsStar || colDef.Width.IsAuto) && totalStarColWeight > 0)\n\t\t\t\t{\n\t\t\t\t\tvar weight = colDef.Width.IsAuto ? 1 : (nfloat)colDef.Width.Value;\n\t\t\t\t\tcolWidths[i] = remainingWidth * (weight / totalStarColWeight);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Calculate positions (including padding offset)\n\t\t\tnfloat currentY = padding;\n\t\t\tfor (int i = 0; i < rowCount; i++)\n\t\t\t{\n\t\t\t\trowPositions[i] = currentY;\n\t\t\t\tcurrentY += rowHeights[i] + (nfloat)_parent.RowSpacing;\n\t\t\t}\n\n\t\t\tnfloat currentX = padding;\n\t\t\tfor (int i = 0; i < colCount; i++)\n\t\t\t{\n\t\t\t\tcolPositions[i] = currentX;\n\t\t\t\tcurrentX += colWidths[i] + (nfloat)_parent.ColumnSpacing;\n\t\t\t}\n\n\t\t\t// Layout children\n\t\t\tforeach (UIView subview in Subviews)\n\t\t\t{\n\t\t\t\tvar spiceView = _parent.Children.FirstOrDefault(v => ((UIView)v).Handle == subview.Handle);\n\t\t\t\tif (spiceView == null)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tint row = GetRow(spiceView);\n\t\t\t\tint col = GetColumn(spiceView);\n\t\t\t\tint rowSpan = GetRowSpan(spiceView);\n\t\t\t\tint colSpan = GetColumnSpan(spiceView);\n\n\t\t\t\tif (row >= rowCount || col >= colCount)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tnfloat x = colPositions[col];\n\t\t\t\tnfloat y = rowPositions[row];\n\t\t\t\t\n\t\t\t\tnfloat width = 0;\n\t\t\t\tfor (int i = col; i < Math.Min(col + colSpan, colCount); i++)\n\t\t\t\t{\n\t\t\t\t\twidth += colWidths[i];\n\t\t\t\t\tif (i < col + colSpan - 1)\n\t\t\t\t\t\twidth += (nfloat)_parent.ColumnSpacing;\n\t\t\t\t}\n\n\t\t\t\tnfloat height = 0;\n\t\t\t\tfor (int i = row; i < Math.Min(row + rowSpan, rowCount); i++)\n\t\t\t\t{\n\t\t\t\t\theight += rowHeights[i];\n\t\t\t\t\tif (i < row + rowSpan - 1)\n\t\t\t\t\t\theight += (nfloat)_parent.RowSpacing;\n\t\t\t\t}\n\n\t\t\t\tsubview.Frame = new CGRect(x, y, width, height);\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/Image.cs",
    "content": "﻿namespace Spice;\n\npublic partial class Image\n{\n\t/// <summary>\n\t/// Returns image.NativeView\n\t/// </summary>\n\t/// <param name=\"image\">The Spice.Image</param>\n\tpublic static implicit operator UIImageView(Image image) => image.NativeView;\n\n\t/// <summary>\n\t/// Represents an image on screen. Set the Source property such as \"spice\".\n\t/// Android -> Android.Widget.ImageView\n\t/// iOS -> UIKit.UIImageView\n\t/// </summary>\n\tpublic Image() : base(_ => new UIImageView { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic Image(CGRect frame) : base(_ => new UIImageView(frame) { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected Image(Func<View, UIView> creator) : base(creator) { }\n\n\t/// <summary>\n\t/// The underlying UIKit.UIImageView\n\t/// </summary>\n\tpublic new UIImageView NativeView => (UIImageView)_nativeView.Value;\n\n\tpartial void OnSourceChanged(string value) => NativeView.Image = UIImage.FromFile($\"{value}.png\");\n}"
  },
  {
    "path": "src/Spice/Platforms/iOS/ImageButton.cs",
    "content": "namespace Spice;\n\npublic partial class ImageButton\n{\n\t/// <summary>\n\t/// Returns imageButton.NativeView\n\t/// </summary>\n\t/// <param name=\"imageButton\">The Spice.ImageButton</param>\n\tpublic static implicit operator UIButton(ImageButton imageButton) => imageButton.NativeView;\n\n\t/// <summary>\n\t/// A button that displays an image instead of text. Use the Clicked event.\n\t/// Android -> Android.Widget.ImageButton\n\t/// iOS -> UIKit.UIButton\n\t/// </summary>\n\tpublic ImageButton() : base(_ => new UIButton { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic ImageButton(CGRect frame) : base(_ => new UIButton(frame) { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected ImageButton(Func<View, UIView> creator) : base(creator) { }\n\n\t/// <summary>\n\t/// The underlying UIKit.UIButton\n\t/// </summary>\n\tpublic new UIButton NativeView => (UIButton)_nativeView.Value;\n\n\tpartial void OnSourceChanged(string value)\n\t{\n\t\tUIImage? image = null;\n\n\t\tif (!string.IsNullOrEmpty(value))\n\t\t{\n\t\t\timage = UIImage.FromFile($\"{value}.png\");\n\t\t}\n\n\t\t// Always update the button image so Source changes (including invalid/empty) are reflected.\n\t\tNativeView.SetImage(image, UIControlState.Normal);\n\n\t\tif (image != null && HorizontalOptions.Alignment != LayoutAlignment.Fill && VerticalOptions.Alignment != LayoutAlignment.Fill)\n\t\t{\n\t\t\tNativeView.SizeToFit();\n\t\t}\n\t}\n\n\tEventHandler? _click;\n\n\tpartial void OnClickedChanged(Action<ImageButton>? value)\n\t{\n\t\t// Always detach any existing handler to avoid multiple subscriptions\n\t\tif (_click != null)\n\t\t{\n\t\t\tNativeView.TouchUpInside -= _click;\n\t\t\t_click = null;\n\t\t}\n\n\t\tif (value != null)\n\t\t{\n\t\t\t_click = (sender, e) => Clicked?.Invoke(this);\n\t\t\tNativeView.TouchUpInside += _click;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/Label.cs",
    "content": "﻿namespace Spice;\n\npublic partial class Label\n{\n\t/// <summary>\n\t/// Returns label.NativeView\n\t/// </summary>\n\t/// <param name=\"label\">The Spice.Label</param>\n\tpublic static implicit operator UILabel(Label label) => label.NativeView;\n\n\t/// <summary>\n\t/// Represents text on screen. Set the Text property to a string value.\n\t/// Android -> Android.Widget.TextView\n\t/// iOS -> UIKit.UILabel\n\t/// </summary>\n\tpublic Label() : base(_ => new UILabel { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic Label(CGRect frame) : base(_ => new UILabel(frame) { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected Label(Func<View, UIView> creator) : base(creator) { }\n\n\t/// <summary>\n\t/// The underlying UILabel\n\t/// </summary>\n\tpublic new UILabel NativeView => (UILabel)_nativeView.Value;\n\n\tpartial void OnTextChanged(string value)\n\t{\n\t\tNativeView.Text = value;\n\t\tif (HorizontalOptions.Alignment != LayoutAlignment.Fill && VerticalOptions.Alignment != LayoutAlignment.Fill)\n\t\t{\n\t\t\tNativeView.SizeToFit();\n\t\t}\n\t}\n\n\tpartial void OnTextColorChanged(Color? value) => NativeView.TextColor = value.ToUIColor();\n}"
  },
  {
    "path": "src/Spice/Platforms/iOS/NavigationView.cs",
    "content": "namespace Spice;\n\npublic partial class NavigationView\n{\n\t/// <summary>\n\t/// Implicit conversion to UINavigationController.\n\t/// </summary>\n\tpublic static implicit operator UINavigationController(NavigationView nav) => nav.NavigationController;\n\n\t/// <summary>\n\t/// NavigationView ctor - creates a UINavigationController\n\t/// </summary>\n\tpublic NavigationView() : base(_ => new UIView { AutoresizingMask = UIViewAutoresizing.All })\n\t{\n\t}\n\n\tWeakReference<UINavigationController>? _navigationController;\n\n\t/// <summary>\n\t/// Gets the underlying UINavigationController\n\t/// </summary>\n\tUINavigationController NavigationController\n\t{\n\t\tget\n\t\t{\n\t\t\tUINavigationController? controller = null;\n\t\t\tif (_navigationController == null || !_navigationController.TryGetTarget(out controller))\n\t\t\t{\n\t\t\t\tcontroller = new UINavigationController();\n\t\t\t\t_navigationController = new WeakReference<UINavigationController>(controller);\n\t\t\t\tNativeView.AddSubview(controller.View!);\n\t\t\t\tcontroller.View!.Frame = NativeView.Bounds;\n\t\t\t\tcontroller.View!.AutoresizingMask = UIViewAutoresizing.All;\n\t\t\t}\n\t\t\treturn controller;\n\t\t}\n\t}\n\n\tpartial void PushCore(View view)\n\t{\n\t\tvar viewController = new UIViewController();\n\t\tvar nativeView = (UIView)view;\n\t\tviewController.View!.AddSubview(nativeView);\n\t\t\n\t\t// Set the title from the view's Title property\n\t\tviewController.Title = view.Title;\n\t\t\n\t\t// Layout the view to fill the view controller's view\n\t\tnativeView.Frame = viewController.View.Bounds;\n\t\tnativeView.AutoresizingMask = UIViewAutoresizing.All;\n\t\t\n\t\tNavigationController.PushViewController(viewController, animated: true);\n\t}\n\n\tpartial void PopCore()\n\t{\n\t\tNavigationController.PopViewController(animated: true);\n\t}\n\n\tpartial void PopToRootCore()\n\t{\n\t\tNavigationController.PopToRootViewController(animated: true);\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/Picker.cs",
    "content": "using System.Collections.ObjectModel;\nusing System.Collections.Specialized;\n\nnamespace Spice;\n\npublic partial class Picker\n{\n\t/// <summary>\n\t/// Returns picker.NativeView\n\t/// </summary>\n\t/// <param name=\"picker\">The Spice.Picker</param>\n\tpublic static implicit operator UIPickerView(Picker picker) => picker.NativeView;\n\n\t/// <summary>\n\t/// Picker control for selecting an item from a list.\n\t/// Android -> Android.Widget.Spinner\n\t/// iOS -> UIKit.UIPickerView\n\t/// </summary>\n\tpublic Picker() : base(_ => new UIPickerView { AutoresizingMask = UIViewAutoresizing.None })\n\t{\n\t\tNativeView.Model = new PickerModel(this);\n\t\tItems.CollectionChanged += OnItemsCollectionChanged;\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic Picker(CGRect frame) : base(_ => new UIPickerView(frame) { AutoresizingMask = UIViewAutoresizing.None })\n\t{\n\t\tNativeView.Model = new PickerModel(this);\n\t\tItems.CollectionChanged += OnItemsCollectionChanged;\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected Picker(Func<View, UIView> creator) : base(creator)\n\t{\n\t\tNativeView.Model = new PickerModel(this);\n\t\tItems.CollectionChanged += OnItemsCollectionChanged;\n\t}\n\n\t/// <summary>\n\t/// The underlying UIPickerView\n\t/// </summary>\n\tpublic new UIPickerView NativeView => (UIPickerView)_nativeView.Value;\n\n\tpartial void OnItemsChanged(ObservableCollection<string>? oldValue, ObservableCollection<string> newValue)\n\t{\n\t\tif (oldValue != null)\n\t\t\toldValue.CollectionChanged -= OnItemsCollectionChanged;\n\t\tnewValue.CollectionChanged += OnItemsCollectionChanged;\n\n\t\tReloadItems();\n\t}\n\n\tvoid OnItemsCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)\n\t{\n\t\tReloadItems();\n\t}\n\n\tvoid ReloadItems()\n\t{\n\t\tNativeView.ReloadAllComponents();\n\n\t\t// Clamp selected index to valid range\n\t\tif (Items.Count == 0)\n\t\t\treturn;\n\n\t\tif (_selectedIndex < 0 || _selectedIndex >= Items.Count)\n\t\t{\n\t\t\tSelectedIndex = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tNativeView.Select(_selectedIndex, 0, false);\n\t\t}\n\t}\n\n\tpartial void OnSelectedIndexChanged(int value)\n\t{\n\t\tif (Items.Count == 0)\n\t\t\treturn;\n\n\t\t// Clamp to valid range for UIPickerView\n\t\tvar index = value;\n\t\tif (index < 0 || index >= Items.Count)\n\t\t\tindex = 0;\n\n\t\tNativeView.Select(index, 0, true);\n\t}\n\n\tpartial void OnTitleChanged(string value)\n\t{\n\t\t// UIPickerView doesn't have a title property, typically shown in a toolbar or label above it\n\t}\n\n\tpartial void OnTextColorChanged(Color? value)\n\t{\n\t\tNativeView.ReloadAllComponents();\n\t}\n\n\tclass PickerModel : UIPickerViewModel\n\t{\n\t\treadonly WeakReference<Picker> _picker;\n\n\t\tpublic PickerModel(Picker picker)\n\t\t{\n\t\t\t_picker = new WeakReference<Picker>(picker);\n\t\t}\n\n\t\tpublic override nint GetComponentCount(UIPickerView pickerView) => 1;\n\n\t\tpublic override nint GetRowsInComponent(UIPickerView pickerView, nint component)\n\t\t{\n\t\t\tif (_picker.TryGetTarget(out var picker))\n\t\t\t{\n\t\t\t\treturn picker.Items.Count;\n\t\t\t}\n\t\t\treturn 0;\n\t\t}\n\n\t\tpublic override NSAttributedString GetAttributedTitle(UIPickerView pickerView, nint row, nint component)\n\t\t{\n\t\t\tif (!_picker.TryGetTarget(out var picker) || row < 0 || row >= picker.Items.Count)\n\t\t\t\treturn new NSAttributedString(string.Empty);\n\n\t\t\tvar text = picker.Items[(int)row];\n\n\t\t\tif (picker.TextColor is Color color)\n\t\t\t{\n\t\t\t\tvar uiColor = UIColor.FromRGBA(\n\t\t\t\t\t(nfloat)color.Red,\n\t\t\t\t\t(nfloat)color.Green,\n\t\t\t\t\t(nfloat)color.Blue,\n\t\t\t\t\t(nfloat)color.Alpha);\n\n\t\t\t\treturn new NSAttributedString(text, new UIStringAttributes { ForegroundColor = uiColor });\n\t\t\t}\n\n\t\t\treturn new NSAttributedString(text);\n\t\t}\n\n\t\tpublic override void Selected(UIPickerView pickerView, nint row, nint component)\n\t\t{\n\t\t\tif (_picker.TryGetTarget(out var picker))\n\t\t\t{\n\t\t\t\tpicker.SelectedIndex = (int)row;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/Platform.cs",
    "content": "﻿namespace Spice;\n\nclass Platform\n{\n\tpublic static UIWindow? Window { get; set; }\n}"
  },
  {
    "path": "src/Spice/Platforms/iOS/PlatformAppearance.cs",
    "content": "namespace Spice;\n\npublic static partial class PlatformAppearance\n{\n\t/// <summary>\n\t/// Gets whether the system is in dark mode on iOS.\n\t/// </summary>\n\tpublic static bool IsDarkMode =>\n\t\tUITraitCollection.CurrentTraitCollection.UserInterfaceStyle == UIUserInterfaceStyle.Dark;\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/PlatformExtensions.cs",
    "content": "﻿using System.Diagnostics;\n\nnamespace Spice;\n\n/// <summary>\n/// Spice extension methods for iOS\n/// </summary>\npublic static class PlatformExtensions\n{\n\t/// <summary>\n\t/// Convert a Microsoft.Maui.Graphics.Color to a UIColor\n\t/// </summary>\n\t/// <param name=\"color\">the Microsoft.Maui.Graphics.Color</param>\n\t/// <returns>A UIColor or null if null was passed in</returns>\n\tpublic static UIColor? ToUIColor(this Color? color)\n\t{\n\t\tif (color == null)\n\t\t\treturn null;\n\n\t\tint r = (int)Math.Round(color.Red * byte.MaxValue);\n\t\tint g = (int)Math.Round(color.Green * byte.MaxValue);\n\t\tint b = (int)Math.Round(color.Blue * byte.MaxValue);\n\t\tint a = (int)Math.Round(color.Alpha * byte.MaxValue);\n\t\treturn UIColor.FromRGBA(r, g, b, a);\n\t}\n\n\t/// <summary>\n\t/// Convert a Microsoft.Maui.Graphics.Color to a CGColor\n\t/// </summary>\n\t/// <param name=\"color\">the Microsoft.Maui.Graphics.Color</param>\n\t/// <returns>A CGColor or null if null was passed in</returns>\n\tpublic static CGColor? ToCGColor(this Color? color)\n\t{\n\t\treturn color.ToUIColor()?.CGColor;\n\t}\n\n\t/// <summary>\n\t/// Calls [UIView recursiveDescription], an internal iOS API for debugging views\n\t/// </summary>\n\t/// <param name=\"view\">The UIView to dump</param>\n\t[Conditional(\"DEBUG\")]\n\tpublic static void DumpHierarchy(this UIView? view)\n\t{\n\t\tif (view == null)\n\t\t\treturn;\n\t\tvar selector = new ObjCRuntime.Selector(\"recursiveDescription\");\n\t\tvar result = view.PerformSelector(selector);\n\t\tDebug.WriteLine(result);\n\t}\n\n\t/// <summary>\n\t/// Convert a DateTime to an NSDate\n\t/// </summary>\n\t/// <param name=\"dateTime\">The DateTime to convert</param>\n\t/// <returns>An NSDate</returns>\n\tpublic static NSDate ToNSDate(this DateTime dateTime)\n\t{\n\t\tvar reference = new DateTime(2001, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);\n\t\treturn NSDate.FromTimeIntervalSinceReferenceDate((dateTime.ToUniversalTime() - reference).TotalSeconds);\n\t}\n\n\t/// <summary>\n\t/// Convert an NSDate to a DateTime\n\t/// </summary>\n\t/// <param name=\"nsDate\">The NSDate to convert</param>\n\t/// <returns>A DateTime</returns>\n\tpublic static DateTime ToDateTime(this NSDate nsDate)\n\t{\n\t\tvar reference = new DateTime(2001, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);\n\t\treturn reference.AddSeconds(nsDate.SecondsSinceReferenceDate).ToLocalTime();\n\t}\n}"
  },
  {
    "path": "src/Spice/Platforms/iOS/ProgressBar.cs",
    "content": "namespace Spice;\n\npublic partial class ProgressBar\n{\n\t/// <summary>\n\t/// Returns progressBar.NativeView\n\t/// </summary>\n\t/// <param name=\"progressBar\">The Spice.ProgressBar</param>\n\tpublic static implicit operator UIProgressView(ProgressBar progressBar) => progressBar.NativeView;\n\n\t/// <summary>\n\t/// Displays a progress indicator showing the completion percentage of a task.\n\t/// Android -> Android.Widget.ProgressBar\n\t/// iOS -> UIKit.UIProgressView\n\t/// </summary>\n\tpublic ProgressBar() : base(_ => new UIProgressView { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic ProgressBar(CGRect frame) : base(_ => new UIProgressView(frame) { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected ProgressBar(Func<View, UIView> creator) : base(creator) { }\n\n\t/// <summary>\n\t/// The underlying UIProgressView\n\t/// </summary>\n\tpublic new UIProgressView NativeView => (UIProgressView)_nativeView.Value;\n\n\tpartial void OnProgressChanged(double value) => NativeView.Progress = (float)value;\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/RadioButton.cs",
    "content": "namespace Spice;\n\npublic partial class RadioButton\n{\n\t/// <summary>\n\t/// Returns radioButton.NativeView\n\t/// </summary>\n\t/// <param name=\"radioButton\">The Spice.RadioButton</param>\n\tpublic static implicit operator UIButton(RadioButton radioButton) => radioButton.NativeView;\n\n\t/// <summary>\n\t/// A radio button control for single selection from a group of options.\n\t/// Android -> Android.Widget.RadioButton\n\t/// iOS -> UIKit.UIButton (with circle styling)\n\t/// </summary>\n\tpublic RadioButton() : base(_ => new UIButton(UIButtonType.System) { AutoresizingMask = UIViewAutoresizing.None })\n\t{\n\t\tInitializeRadioButton();\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic RadioButton(CGRect frame) : base(_ =>\n\t{\n\t\tvar button = new UIButton(UIButtonType.System)\n\t\t{\n\t\t\tAutoresizingMask = UIViewAutoresizing.None,\n\t\t\tFrame = frame\n\t\t};\n\t\treturn button;\n\t})\n\t{\n\t\tInitializeRadioButton();\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected RadioButton(Func<View, UIView> creator) : base(creator)\n\t{\n\t\tInitializeRadioButton();\n\t}\n\n\t/// <summary>\n\t/// The underlying UIKit.UIButton\n\t/// </summary>\n\tpublic new UIButton NativeView => (UIButton)_nativeView.Value;\n\n\tvoid InitializeRadioButton()\n\t{\n\t\tNativeView.SetImage(UIImage.GetSystemImage(\"circle\"), UIControlState.Normal);\n\t\tNativeView.SetImage(UIImage.GetSystemImage(\"circle.fill\"), UIControlState.Selected);\n\t\tNativeView.TouchUpInside += OnTouchUpInside;\n\t}\n\n\tpartial void OnIsCheckedChangedPartial(bool value)\n\t{\n\t\tNativeView.Selected = value;\n\t}\n\n\tpartial void OnContentChanged(string? value)\n\t{\n\t\tNativeView.SetTitle(value, UIControlState.Normal);\n\t}\n\n\tvoid OnTouchUpInside(object? sender, EventArgs e)\n\t{\n\t\t// Radio buttons only get checked, not unchecked by user\n\t\tif (!IsChecked)\n\t\t{\n\t\t\tIsChecked = true;\n\t\t\t// Fire CheckedChanged only when state actually changes\n\t\t\tCheckedChanged?.Invoke(this);\n\t\t}\n\t\t// Tapping an already-checked radio button does nothing\n\t}\n\n\tpartial void OnCheckedChangedChanged(Action<RadioButton>? value)\n\t{\n\t\t// Event subscription is handled in InitializeRadioButton\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/RefreshView.cs",
    "content": "namespace Spice;\n\npublic partial class RefreshView\n{\n\t/// <summary>\n\t/// Returns refreshView.NativeView\n\t/// </summary>\n\t/// <param name=\"refreshView\">The Spice.RefreshView</param>\n\tpublic static implicit operator UIView(RefreshView refreshView) => refreshView.NativeView;\n\n\t/// <summary>\n\t/// A container view that provides pull-to-refresh functionality for scrollable content.\n\t/// Wrap a scrollable view (such as ScrollView, ListView, or CollectionView) to enable pull-to-refresh.\n\t/// Android -> AndroidX.SwipeRefreshLayout.Widget.SwipeRefreshLayout\n\t/// iOS -> UIKit.UIView with UIRefreshControl attached to child scroll view\n\t/// </summary>\n\tpublic RefreshView() : base(v => new UIView { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic RefreshView(CGRect frame) : base(v => new UIView(frame) { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected RefreshView(Func<View, UIView> creator) : base(creator) { }\n\n\tUIRefreshControl? _refreshControl;\n\tUIScrollView? _scrollView;\n\n\tUIRefreshControl GetOrCreateRefreshControl()\n\t{\n\t\tif (_refreshControl != null)\n\t\t{\n\t\t\treturn _refreshControl;\n\t\t}\n\n\t\t_refreshControl = new UIRefreshControl();\n\t\t_refreshControl.ValueChanged += OnRefreshControlValueChanged;\n\n\t\treturn _refreshControl;\n\t}\n\n\tvoid OnRefreshControlValueChanged(object? sender, EventArgs e)\n\t{\n\t\t// Trigger command if set\n\t\tCommand?.Invoke();\n\t\t\n\t\t// Update IsRefreshing to true when user pulls to refresh\n\t\t// The user should set IsRefreshing = false when refresh completes\n\t\tif (!IsRefreshing)\n\t\t{\n\t\t\tIsRefreshing = true;\n\t\t}\n\t}\n\n\tbool TryAttachRefreshControl(UIView view)\n\t{\n\t\t// Look for a UIScrollView in the view hierarchy\n\t\tif (view is UIScrollView scrollView)\n\t\t{\n\t\t\tvar refreshControl = GetOrCreateRefreshControl();\n\t\t\tscrollView.RefreshControl = refreshControl;\n\t\t\tscrollView.AlwaysBounceVertical = true;\n\t\t\t_scrollView = scrollView;\n\t\t\treturn true;\n\t\t}\n\n\t\t// Check subviews\n\t\tif (view.Subviews != null)\n\t\t{\n\t\t\tforeach (var subview in view.Subviews)\n\t\t\t{\n\t\t\t\tif (TryAttachRefreshControl(subview))\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tvoid TryDetachRefreshControl()\n\t{\n\t\tif (_scrollView != null)\n\t\t{\n\t\t\t_scrollView.RefreshControl = null;\n\t\t\t_scrollView = null;\n\t\t}\n\n\t\tif (_refreshControl != null)\n\t\t{\n\t\t\t_refreshControl.ValueChanged -= OnRefreshControlValueChanged;\n\t\t\t_refreshControl = null;\n\t\t}\n\t}\n\n\tNSLayoutConstraint[]? _contentConstraints;\n\n\tpartial void OnContentChanged(View? oldContent, View? newContent)\n\t{\n\t\t// Detach refresh control from old content\n\t\tTryDetachRefreshControl();\n\n\t\t// Remove old content\n\t\tif (oldContent != null)\n\t\t{\n\t\t\tConstraintHelper.RemoveConstraints(_contentConstraints);\n\t\t\t_contentConstraints = null;\n\t\t\t((UIView)oldContent).RemoveFromSuperview();\n\t\t}\n\n\t\t// Add new content\n\t\tif (newContent != null)\n\t\t{\n\t\t\tvar contentView = (UIView)newContent;\n\t\t\tNativeView.AddSubview(contentView);\n\t\t\tvar padding = (nfloat)Padding;\n\t\t\t_contentConstraints = ConstraintHelper.PinEdges(contentView, NativeView, padding);\n\t\t\t\n\t\t\t// Try to attach refresh control to scrollable content\n\t\t\tTryAttachRefreshControl(contentView);\n\t\t}\n\t}\n\n\tpartial void OnPaddingChanged(double value)\n\t{\n\t\tif (_contentConstraints != null)\n\t\t{\n\t\t\tvar padding = (nfloat)value;\n\t\t\tConstraintHelper.UpdateInsets(_contentConstraints, padding);\n\t\t}\n\t}\n\n\tpartial void OnIsRefreshingChanged(bool value)\n\t{\n\t\tif (_refreshControl != null)\n\t\t{\n\t\t\tif (value)\n\t\t\t{\n\t\t\t\tif (!_refreshControl.Refreshing)\n\t\t\t\t{\n\t\t\t\t\t_refreshControl.BeginRefreshing();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (_refreshControl.Refreshing)\n\t\t\t\t{\n\t\t\t\t\t_refreshControl.EndRefreshing();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpartial void OnRefreshColorChanged(Color? value)\n\t{\n\t\tif (_refreshControl != null && value != null)\n\t\t{\n\t\t\t_refreshControl.TintColor = value.ToUIColor();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/ScrollView.cs",
    "content": "namespace Spice;\n\npublic partial class ScrollView\n{\n\t/// <summary>\n\t/// Returns scrollView.NativeView\n\t/// </summary>\n\t/// <param name=\"scrollView\">The Spice.ScrollView</param>\n\tpublic static implicit operator UIScrollView(ScrollView scrollView) => scrollView.NativeView;\n\n\t/// <summary>\n\t/// A scrollable container view that can hold a single child view.\n\t/// Android -> Android.Widget.ScrollView / Android.Widget.HorizontalScrollView\n\t/// iOS -> UIKit.UIScrollView\n\t/// </summary>\n\tpublic ScrollView() : base(v => new SpiceScrollView((ScrollView)v) { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"orientation\">The scroll orientation.</param>\n\tpublic ScrollView(Orientation orientation) : this()\n\t{\n\t\tOrientation = orientation;\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic ScrollView(CGRect frame) : base(v => new SpiceScrollView((ScrollView)v, frame) { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected ScrollView(Func<View, UIView> creator) : base(creator) { }\n\n\t/// <summary>\n\t/// The underlying UIScrollView\n\t/// </summary>\n\tpublic new UIScrollView NativeView => (UIScrollView)_nativeView.Value;\n\n\tView? _childView;\n\n\tpartial void OnOrientationChanging(Orientation value)\n\t{\n\t\tif (!_nativeView.IsValueCreated)\n\t\t\treturn;\n\n\t\tvar scrollView = NativeView;\n\t\tif (value == Orientation.Horizontal)\n\t\t{\n\t\t\tscrollView.AlwaysBounceHorizontal = true;\n\t\t\tscrollView.AlwaysBounceVertical = false;\n\t\t\tscrollView.ShowsHorizontalScrollIndicator = true;\n\t\t\tscrollView.ShowsVerticalScrollIndicator = false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tscrollView.AlwaysBounceHorizontal = false;\n\t\t\tscrollView.AlwaysBounceVertical = true;\n\t\t\tscrollView.ShowsHorizontalScrollIndicator = false;\n\t\t\tscrollView.ShowsVerticalScrollIndicator = true;\n\t\t}\n\n\t\tif (_childView != null)\n\t\t\tUpdateContentSize(_childView);\n\t}\n\n\tpartial void OnPaddingChanged(double value)\n\t{\n\t\tvar padding = (nfloat)value;\n\t\tNativeView.ContentInset = new UIEdgeInsets(padding, padding, padding, padding);\n\t}\n\n\t/// <inheritdoc />\n\tprotected override void AddSubview(View view)\n\t{\n\t\t// ScrollView should only have one child — remove existing subviews\n\t\tforeach (UIView subview in NativeView.Subviews)\n\t\t{\n\t\t\tsubview.RemoveFromSuperview();\n\t\t}\n\n\t\t_childView = view;\n\t\tNativeView.AddSubview(view);\n\t\tview.UpdateAlign();\n\t\tUpdateContentSize(view);\n\t}\n\n\tvoid UpdateContentSize(View view)\n\t{\n\t\tvar childView = (UIView)view;\n\t\tchildView.SizeToFit();\n\t\tvar size = childView.Frame.Size;\n\n\t\tif (Orientation == Orientation.Horizontal)\n\t\t{\n\t\t\tNativeView.ContentSize = new CGSize(size.Width, NativeView.Frame.Height);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tNativeView.ContentSize = new CGSize(NativeView.Frame.Width, size.Height);\n\t\t}\n\t}\n\n\tclass SpiceScrollView : UIScrollView\n\t{\n\t\treadonly ScrollView _parent;\n\n\t\tpublic SpiceScrollView(ScrollView parent) => _parent = parent;\n\n\t\tpublic SpiceScrollView(ScrollView parent, CGRect frame) : base(frame) => _parent = parent;\n\n\t\tpublic override void LayoutSubviews()\n\t\t{\n\t\t\tbase.LayoutSubviews();\n\n\t\t\tif (_parent._childView != null)\n\t\t\t{\n\t\t\t\t_parent.UpdateContentSize(_parent._childView);\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/SearchBar.cs",
    "content": "﻿namespace Spice;\n\npublic partial class SearchBar\n{\n\t/// <summary>\n\t/// Returns searchBar.NativeView\n\t/// </summary>\n\t/// <param name=\"searchBar\">The Spice.SearchBar</param>\n\tpublic static implicit operator UISearchBar(SearchBar searchBar) => searchBar.NativeView;\n\n\t/// <summary>\n\t/// Control for search input with a search button.\n\t/// Android -> Android.Widget.SearchView\n\t/// iOS -> UIKit.UISearchBar\n\t/// </summary>\n\tpublic SearchBar() : base(_ => new UISearchBar { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic SearchBar(CGRect frame) : base(_ => new UISearchBar(frame) { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected SearchBar(Func<View, UIView> creator) : base(creator) { }\n\n\t/// <summary>\n\t/// The underlying UISearchBar\n\t/// </summary>\n\tpublic new UISearchBar NativeView => (UISearchBar)_nativeView.Value;\n\n\tpartial void OnTextChanged(string value) => NativeView.Text = value;\n\n\tpartial void OnPlaceholderChanged(string? value)\n\t{\n\t\tNativeView.Placeholder = value;\n\t\t// Reapply placeholder color if set\n\t\tif (PlaceholderColor != null)\n\t\t\tOnPlaceholderColorChanged(PlaceholderColor);\n\t}\n\n\tpartial void OnTextColorChanged(Color? value)\n\t{\n\t\tvar textField = NativeView.SearchTextField;\n\t\tif (textField != null)\n\t\t\ttextField.TextColor = value.ToUIColor();\n\t}\n\n\tpartial void OnPlaceholderColorChanged(Color? value)\n\t{\n\t\tvar textField = NativeView.SearchTextField;\n\t\tif (textField != null)\n\t\t{\n\t\t\tvar placeholderText = textField.Placeholder ?? \"\";\n\t\t\tif (value != null)\n\t\t\t{\n\t\t\t\tvar attributes = new UIStringAttributes { ForegroundColor = value.ToUIColor() };\n\t\t\t\ttextField.AttributedPlaceholder = new NSAttributedString(placeholderText, attributes);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Reset to default\n\t\t\t\ttextField.AttributedPlaceholder = new NSAttributedString(placeholderText);\n\t\t\t}\n\t\t}\n\t}\n\n\tSearchBarDelegate? _delegate;\n\n\tvoid UpdateDelegate()\n\t{\n\t\tif (SearchButtonPressed == null && TextChanged == null)\n\t\t{\n\t\t\tNativeView.Delegate = null!;\n\t\t\t_delegate = null;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (_delegate == null)\n\t\t\t{\n\t\t\t\t_delegate = new SearchBarDelegate(this);\n\t\t\t\tNativeView.Delegate = _delegate;\n\t\t\t}\n\t\t}\n\t}\n\n\tpartial void OnSearchButtonPressedChanged(Action<SearchBar>? value) => UpdateDelegate();\n\n\tpartial void OnTextChangedChanged(Action<SearchBar>? value) => UpdateDelegate();\n\n\tclass SearchBarDelegate : UISearchBarDelegate\n\t{\n\t\treadonly WeakReference<SearchBar> _searchBar;\n\n\t\tpublic SearchBarDelegate(SearchBar searchBar)\n\t\t{\n\t\t\t_searchBar = new WeakReference<SearchBar>(searchBar);\n\t\t}\n\n\t\tpublic override void SearchButtonClicked(UISearchBar uiSearchBar)\n\t\t{\n\t\t\tif (_searchBar.TryGetTarget(out var searchBar))\n\t\t\t{\n\t\t\t\tsearchBar.Text = uiSearchBar.Text ?? \"\";\n\t\t\t\tsearchBar.SearchButtonPressed?.Invoke(searchBar);\n\t\t\t}\n\t\t}\n\n\t\tpublic override void TextChanged(UISearchBar uiSearchBar, string searchText)\n\t\t{\n\t\t\tif (_searchBar.TryGetTarget(out var searchBar))\n\t\t\t{\n\t\t\t\tsearchBar.Text = searchText;\n\t\t\t\tsearchBar.TextChanged?.Invoke(searchBar);\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/Slider.cs",
    "content": "namespace Spice;\n\npublic partial class Slider\n{\n\t/// <summary>\n\t/// Returns slider.NativeView\n\t/// </summary>\n\t/// <param name=\"slider\">The Spice.Slider</param>\n\tpublic static implicit operator UISlider(Slider slider) => slider.NativeView;\n\n\t/// <summary>\n\t/// A slider control for selecting a numeric value from a range.\n\t/// Android -> Android.Widget.SeekBar\n\t/// iOS -> UIKit.UISlider\n\t/// </summary>\n\tpublic Slider() : base(_ => new UISlider { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic Slider(CGRect frame) : base(_ => new UISlider(frame) { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected Slider(Func<View, UIView> creator) : base(creator) { }\n\n\t/// <summary>\n\t/// The underlying UIKit.UISlider\n\t/// </summary>\n\tpublic new UISlider NativeView => (UISlider)_nativeView.Value;\n\n\tpartial void OnMinimumChanged(double value) => NativeView.MinValue = (float)value;\n\n\tpartial void OnMaximumChanged(double value) => NativeView.MaxValue = (float)value;\n\n\tpartial void OnValueChanged(double value)\n\t{\n\t\tif (Math.Abs(NativeView.Value - (float)value) > float.Epsilon)\n\t\t{\n\t\t\tNativeView.Value = (float)value;\n\t\t}\n\t}\n\n\tEventHandler? _valueChangedEvent;\n\n\tpartial void OnValueChangedChanged(Action<Slider>? value)\n\t{\n\t\tif (_valueChangedEvent != null)\n\t\t{\n\t\t\tNativeView.ValueChanged -= _valueChangedEvent;\n\t\t\t_valueChangedEvent = null;\n\t\t}\n\n\t\tif (value != null)\n\t\t{\n\t\t\t_valueChangedEvent = (sender, e) =>\n\t\t\t{\n\t\t\t\tValue = NativeView.Value;\n\t\t\t\tValueChanged?.Invoke(this);\n\t\t\t};\n\n\t\t\tNativeView.ValueChanged += _valueChangedEvent;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/SpiceAppDelegate.cs",
    "content": "﻿using System.Diagnostics;\nusing Foundation;\nusing ObjCRuntime;\n\nnamespace Spice;\n\n/// <summary>\n/// A <see cref=\"IUIWindowSceneDelegate\"/> for Spice applications that sets up the <see cref=\"UIWindow\"/>\n/// and root <see cref=\"Application\"/> view using the modern scene-based lifecycle.\n/// Declared as <c>UISceneDelegateClassName</c> in Info.plist.\n/// </summary>\n[Register(\"SpiceSceneDelegate\")]\npublic class SpiceSceneDelegate : UIResponder, IUIWindowSceneDelegate\n{\n\t/// <summary>\n\t/// The main window for the scene.\n\t/// </summary>\n\t[Export(\"window\")]\n\tpublic UIWindow? Window { get; set; }\n\n\t/// <summary>\n\t/// Called when a new scene session is being created and the UIWindow needs to be configured.\n\t/// </summary>\n\t[Export(\"scene:willConnectToSession:options:\")]\n\tpublic virtual void WillConnect(UIScene scene, UISceneSession session, UISceneConnectionOptions connectionOptions)\n\t{\n\t\tif (scene is UIWindowScene windowScene)\n\t\t{\n\t\t\tWindow = Platform.Window = new UIWindow(windowScene);\n\n\t\t\tvar appDelegate = (SpiceAppDelegate)UIApplication.SharedApplication.Delegate;\n\t\t\tvar vc = new SpiceViewController();\n\t\t\tvar view = vc.View;\n\t\t\tDebug.Assert(view != null, \"UIViewController should have a view\");\n\t\t\tview.BackgroundColor = UIColor.SystemBackground;\n\t\t\tview.AddSubview(appDelegate.CreateApplication());\n\t\t\tWindow.RootViewController = vc;\n\t\t\tWindow.MakeKeyAndVisible();\n\t\t}\n\t}\n}\n\n/// <summary>\n/// The <see cref=\"UIApplicationDelegate\"/> to use in Spice applications.\n/// Override <see cref=\"CreateApplication\"/> to provide the root <see cref=\"Application\"/> view.\n/// Requires <c>UIApplicationSceneManifest</c> in Info.plist with <c>UISceneDelegateClassName</c> set to <c>SpiceSceneDelegate</c>.\n/// </summary>\npublic abstract class SpiceAppDelegate : UIApplicationDelegate\n{\n\t/// <summary>\n\t/// Creates the root <see cref=\"Application\"/> view for the app.\n\t/// </summary>\n\tpublic abstract Application CreateApplication();\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/SpiceViewController.cs",
    "content": "namespace Spice;\n\n/// <summary>\n/// A UIViewController that detects system appearance (dark/light mode) changes\n/// and notifies <see cref=\"PlatformAppearance\"/>.\n/// </summary>\nclass SpiceViewController : UIViewController\n{\n\tpublic override void ViewDidLoad()\n\t{\n\t\tbase.ViewDidLoad();\n\t\tif (OperatingSystem.IsIOSVersionAtLeast(17))\n\t\t{\n\t\t\tRegisterForTraitChanges([typeof(UITraitUserInterfaceStyle)], (IUITraitEnvironment _, UITraitCollection _) =>\n\t\t\t{\n\t\t\t\tPlatformAppearance.OnChanged(PlatformAppearance.IsDarkMode);\n\t\t\t});\n\t\t}\n\t}\n\n#pragma warning disable CA1422 // Validate platform compatibility (fallback for iOS 16)\n\tpublic override void TraitCollectionDidChange(UITraitCollection? previousTraitCollection)\n\t{\n\t\tbase.TraitCollectionDidChange(previousTraitCollection);\n\n\t\tif (!OperatingSystem.IsIOSVersionAtLeast(17) &&\n\t\t\tpreviousTraitCollection?.UserInterfaceStyle != TraitCollection.UserInterfaceStyle)\n\t\t{\n\t\t\tPlatformAppearance.OnChanged(PlatformAppearance.IsDarkMode);\n\t\t}\n\t}\n#pragma warning restore CA1422\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/StackLayout.cs",
    "content": "﻿namespace Spice;\n\npublic partial class StackLayout\n{\n\t/// <summary>\n\t/// Returns stackLayout.NativeView\n\t/// </summary>\n\t/// <param name=\"stackLayout\">The Spice.StackLayout</param>\n\tpublic static implicit operator UIStackView(StackLayout stackLayout) => stackLayout.NativeView;\n\n\t/// <summary>\n\t/// A parent view for laying out child controls in a row. Defaults to Orientation=Vertical.\n\t/// Android -> Android.Widget.LinearLayout\n\t/// iOS -> UIKit.UIStackView\n\t/// </summary>\n\tpublic StackLayout() : this(v => new SpiceStackView((StackLayout)v) { AutoresizingMask = UIViewAutoresizing.None, Alignment = UIStackViewAlignment.Center, Axis = UILayoutConstraintAxis.Vertical }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic StackLayout(CGRect frame) : this(v => new SpiceStackView((StackLayout)v, frame) { AutoresizingMask = UIViewAutoresizing.None, Alignment = UIStackViewAlignment.Center, Axis = UILayoutConstraintAxis.Vertical }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected StackLayout(Func<View, UIView> creator) : base(creator) { }\n\n\t/// <summary>\n\t/// The underlying UIStackView\n\t/// </summary>\n\tpublic new UIStackView NativeView => (UIStackView)_nativeView.Value;\n\n\tpartial void OnOrientationChanging(Orientation value)\n\t{\n\t\tswitch (value)\n\t\t{\n\t\t\tcase Orientation.Vertical:\n\t\t\t\tNativeView.Axis = UILayoutConstraintAxis.Vertical;\n\t\t\t\tbreak;\n\t\t\tcase Orientation.Horizontal:\n\t\t\t\tNativeView.Axis = UILayoutConstraintAxis.Horizontal;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new NotSupportedException($\"{nameof(Orientation)} value '{value}' not supported!\");\n\t\t}\n\t}\n\n\tpartial void OnSpacingChanged(double value) => NativeView.Spacing = (nfloat)value;\n\n\tpartial void OnPaddingChanged(double value)\n\t{\n\t\tvar padding = (nfloat)value;\n\t\tNativeView.LayoutMargins = new UIEdgeInsets(padding, padding, padding, padding);\n\t\tNativeView.LayoutMarginsRelativeArrangement = true;\n\t}\n\n\t/// <inheritdoc />\n\tprotected override void AddSubview(View view)\n\t{\n\t\tNativeView.AddArrangedSubview(view);\n\t\tview.UpdateAlign();\n\t}\n\n\tclass SpiceStackView : UIStackView\n\t{\n\t\treadonly StackLayout _parent;\n\n\t\tpublic SpiceStackView(StackLayout parent) => _parent = parent;\n\n\t\tpublic SpiceStackView(StackLayout parent, CGRect frame) : base(frame) => _parent = parent;\n\n\t\tpublic override CGSize SizeThatFits(CGSize size)\n\t\t{\n\t\t\tvar measured = new CGSize();\n\t\t\tforeach (var child in Subviews)\n\t\t\t{\n\t\t\t\tvar childSize = child.SizeThatFits(size);\n\t\t\t\tif (_parent.Orientation == Orientation.Vertical)\n\t\t\t\t{\n\t\t\t\t\tif (childSize.Width > measured.Width)\n\t\t\t\t\t\tmeasured.Width = childSize.Width;\n\t\t\t\t\tmeasured.Height += childSize.Height;\n\t\t\t\t}\n\t\t\t\telse if (_parent.Orientation == Orientation.Horizontal)\n\t\t\t\t{\n\t\t\t\t\tmeasured.Width += childSize.Width;\n\t\t\t\t\tif (childSize.Height > measured.Height)\n\t\t\t\t\t\tmeasured.Height = childSize.Height;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn measured;\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/Spice/Platforms/iOS/SwipeView.cs",
    "content": "namespace Spice;\n\npublic partial class SwipeView\n{\n\t/// <summary>\n\t/// Returns swipeView.NativeView\n\t/// </summary>\n\t/// <param name=\"swipeView\">The Spice.SwipeView</param>\n\tpublic static implicit operator UIView(SwipeView swipeView) => swipeView.NativeView;\n\n\t/// <summary>\n\t/// A container control that wraps around an item of content and provides context menu items \n\t/// that are revealed by a swipe gesture.\n\t/// iOS -> UIKit.UIView with gesture recognizers\n\t/// </summary>\n\tpublic SwipeView() : base(_ => new UIView { AutoresizingMask = UIViewAutoresizing.None, ClipsToBounds = true })\n\t{\n\t\tSetupGestureRecognizers();\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic SwipeView(CGRect frame) : base(_ => new UIView(frame) { AutoresizingMask = UIViewAutoresizing.None, ClipsToBounds = true })\n\t{\n\t\tSetupGestureRecognizers();\n\t}\n\n\t/// <summary>\n\t/// Initializes a new instance of <see cref=\"SwipeView\"/> with a custom native view creator.\n\t/// </summary>\n\t/// <param name=\"creator\">Factory function that creates the underlying UIKit.UIView.</param>\n\tprotected SwipeView(Func<View, UIView> creator) : base(creator)\n\t{\n\t\tSetupGestureRecognizers();\n\t}\n\n\tUIPanGestureRecognizer? _panGesture;\n\tUIView? _contentView;\n\tUIView? _swipeItemsView;\n\tSwipeDirection? _currentSwipeDirection;\n\tnfloat _startPosition;\n\n\tvoid SetupGestureRecognizers()\n\t{\n\t\t_panGesture = new UIPanGestureRecognizer(HandlePan);\n\t\tNativeView.AddGestureRecognizer(_panGesture);\n\t}\n\n\tvoid HandlePan(UIPanGestureRecognizer gesture)\n\t{\n\t\tvar translation = gesture.TranslationInView(NativeView);\n\t\tvar velocity = gesture.VelocityInView(NativeView);\n\n\t\tswitch (gesture.State)\n\t\t{\n\t\t\tcase UIGestureRecognizerState.Began:\n\t\t\t\t_startPosition = _contentView?.Frame.X ?? 0;\n\t\t\t\t_currentSwipeDirection = null;\n\t\t\t\tbreak;\n\n\t\t\tcase UIGestureRecognizerState.Changed:\n\t\t\t\tif (_contentView == null)\n\t\t\t\t\tbreak;\n\n\t\t\t\t// Determine swipe direction based on velocity\n\t\t\t\tSwipeDirection? direction = null;\n\t\t\t\tif (Math.Abs(velocity.X) > Math.Abs(velocity.Y))\n\t\t\t\t{\n\t\t\t\t\tdirection = velocity.X > 0 ? SwipeDirection.Right : SwipeDirection.Left;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tdirection = velocity.Y > 0 ? SwipeDirection.Down : SwipeDirection.Up;\n\t\t\t\t}\n\n\t\t\t\t// Only handle horizontal swipes for now (most common use case)\n\t\t\t\tif (direction == SwipeDirection.Left || direction == SwipeDirection.Right)\n\t\t\t\t{\n\t\t\t\t\tif (_currentSwipeDirection == null)\n\t\t\t\t\t{\n\t\t\t\t\t\t_currentSwipeDirection = direction;\n\t\t\t\t\t\tSwipeStarted?.Invoke(this, direction.Value);\n\t\t\t\t\t}\n\n\t\t\t\t\tvar newX = _startPosition + translation.X;\n\t\t\t\t\t_contentView.Frame = new CGRect(newX, _contentView.Frame.Y, _contentView.Frame.Width, _contentView.Frame.Height);\n\n\t\t\t\t\tSwipeChanging?.Invoke(this, direction.Value, Math.Abs(translation.X));\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase UIGestureRecognizerState.Ended:\n\t\t\tcase UIGestureRecognizerState.Cancelled:\n\t\t\t\tif (_currentSwipeDirection != null)\n\t\t\t\t{\n\t\t\t\t\tvar threshold = Threshold > 0 ? Threshold : 50; // points\n\t\t\t\t\tvar exceedsThreshold = Math.Abs(translation.X) > threshold;\n\t\t\t\t\tvar didOpen = false;\n\n\t\t\t\t\tif (exceedsThreshold && _currentSwipeDirection == SwipeDirection.Left && RightItems != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tShowSwipeItems(RightItems, SwipeDirection.Left);\n\t\t\t\t\t\tdidOpen = true;\n\t\t\t\t\t}\n\t\t\t\t\telse if (exceedsThreshold && _currentSwipeDirection == SwipeDirection.Right && LeftItems != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tShowSwipeItems(LeftItems, SwipeDirection.Right);\n\t\t\t\t\t\tdidOpen = true;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tResetPosition();\n\t\t\t\t\t}\n\n\t\t\t\t\tSwipeEnded?.Invoke(this, _currentSwipeDirection.Value, didOpen);\n\t\t\t\t\t_currentSwipeDirection = null;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tvoid ShowSwipeItems(SwipeItems items, SwipeDirection direction)\n\t{\n\t\tif (_contentView == null)\n\t\t\treturn;\n\n\t\t// Clean up existing swipe items view\n\t\t_swipeItemsView?.RemoveFromSuperview();\n\n\t\t// Create swipe items container\n\t\t_swipeItemsView = new UIView\n\t\t{\n\t\t\tBackgroundColor = UIColor.Clear\n\t\t};\n\n\t\tnfloat x = 0;\n\t\tnfloat itemWidth = 75; // Default item width in points\n\t\tnfloat visibleCount = items.Items.Count(i => i.IsVisible);\n\t\tnfloat totalWidth = visibleCount * itemWidth;\n\n\t\tforeach (var item in items.Items)\n\t\t{\n\t\t\tif (!item.IsVisible)\n\t\t\t\tcontinue;\n\n\t\t\tvar button = UIButton.FromType(UIButtonType.System);\n\t\t\tbutton.Frame = new CGRect(x, 0, itemWidth, NativeView.Frame.Height);\n\t\t\tbutton.SetTitle(item.Text ?? \"\", UIControlState.Normal);\n\t\t\tbutton.BackgroundColor = item.BackgroundColor?.ToUIColor() ?? UIColor.LightGray;\n\t\t\tbutton.SetTitleColor(UIColor.White, UIControlState.Normal);\n\n\t\t\t// Capture item reference for the closure\n\t\t\tvar swipeItem = item;\n\t\t\tbutton.TouchUpInside += (s, e) =>\n\t\t\t{\n\t\t\t\tswipeItem.Invoked?.Invoke(swipeItem);\n\t\t\t\t\n\t\t\t\tif (items.SwipeBehaviorOnInvoked == SwipeBehaviorOnInvoked.Close ||\n\t\t\t\t\titems.SwipeBehaviorOnInvoked == SwipeBehaviorOnInvoked.Auto)\n\t\t\t\t{\n\t\t\t\t\tClose();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t_swipeItemsView.AddSubview(button);\n\t\t\tx += itemWidth;\n\t\t}\n\n\t\t_swipeItemsView.Frame = direction == SwipeDirection.Left\n\t\t\t? new CGRect(NativeView.Frame.Width - totalWidth, 0, totalWidth, NativeView.Frame.Height)\n\t\t\t: new CGRect(0, 0, totalWidth, NativeView.Frame.Height);\n\n\t\tNativeView.InsertSubviewBelow(_swipeItemsView, _contentView);\n\n\t\t// Animate content view to reveal swipe items\n\t\tUIView.Animate(0.3, () =>\n\t\t{\n\t\t\tif (_contentView != null)\n\t\t\t{\n\t\t\t\tvar newX = direction == SwipeDirection.Left ? -totalWidth : totalWidth;\n\t\t\t\t_contentView.Frame = new CGRect(newX, _contentView.Frame.Y, _contentView.Frame.Width, _contentView.Frame.Height);\n\t\t\t}\n\t\t});\n\t}\n\n\tvoid ResetPosition()\n\t{\n\t\tif (_contentView == null)\n\t\t\treturn;\n\n\t\tUIView.Animate(0.3, () =>\n\t\t{\n\t\t\t_contentView.Frame = new CGRect(0, 0, NativeView.Frame.Width, NativeView.Frame.Height);\n\t\t}, () =>\n\t\t{\n\t\t\t_swipeItemsView?.RemoveFromSuperview();\n\t\t\t_swipeItemsView = null;\n\t\t});\n\t}\n\n\tpartial void OnContentChanged(View? oldContent, View? newContent)\n\t{\n\t\t// Remove old content\n\t\tif (oldContent != null)\n\t\t{\n\t\t\t((UIView)oldContent).RemoveFromSuperview();\n\t\t}\n\n\t\t_contentView?.RemoveFromSuperview();\n\n\t\t// Add new content\n\t\tif (newContent != null)\n\t\t{\n\t\t\t_contentView = new UIView\n\t\t\t{\n\t\t\t\tFrame = new CGRect(0, 0, NativeView.Frame.Width, NativeView.Frame.Height),\n\t\t\t\tAutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight\n\t\t\t};\n\t\t\t_contentView.AddSubview(newContent);\n\t\t\tnewContent.UpdateAlign();\n\t\t\tNativeView.AddSubview(_contentView);\n\t\t}\n\t}\n\n\tpartial void OnOpen(SwipeDirection direction)\n\t{\n\t\tvar items = direction switch\n\t\t{\n\t\t\tSwipeDirection.Left => RightItems,\n\t\t\tSwipeDirection.Right => LeftItems,\n\t\t\tSwipeDirection.Up => null, // vertical not yet supported\n\t\t\tSwipeDirection.Down => null, // vertical not yet supported\n\t\t\t_ => null\n\t\t};\n\n\t\tif (items != null)\n\t\t{\n\t\t\tShowSwipeItems(items, direction);\n\t\t}\n\t}\n\n\tpartial void OnClose()\n\t{\n\t\tResetPosition();\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/Switch.cs",
    "content": "namespace Spice;\n\npublic partial class Switch\n{\n\t/// <summary>\n\t/// Returns switchControl.NativeView\n\t/// </summary>\n\t/// <param name=\"switchControl\">The Spice.Switch</param>\n\tpublic static implicit operator UISwitch(Switch switchControl) => switchControl.NativeView;\n\n\t/// <summary>\n\t/// A toggle switch control for boolean on/off input.\n\t/// Android -> AndroidX.AppCompat.Widget.SwitchCompat\n\t/// iOS -> UIKit.UISwitch\n\t/// </summary>\n\tpublic Switch() : base(_ => new UISwitch { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic Switch(CGRect frame) : base(_ => new UISwitch(frame) { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected Switch(Func<View, UIView> creator) : base(creator) { }\n\n\t/// <summary>\n\t/// The underlying UIKit.UISwitch\n\t/// </summary>\n\tpublic new UISwitch NativeView => (UISwitch)_nativeView.Value;\n\n\tpartial void OnIsOnChanged(bool value) => NativeView.SetState(value, true);\n\n\tEventHandler? _valueChanged;\n\n\tpartial void OnToggledChanged(Action<Switch>? value)\n\t{\n\t\t// Unsubscribe existing handler if any\n\t\tif (_valueChanged != null)\n\t\t{\n\t\t\tNativeView.ValueChanged -= _valueChanged;\n\t\t\t_valueChanged = null;\n\t\t}\n\n\t\tif (value != null)\n\t\t{\n\t\t\tNativeView.ValueChanged += _valueChanged = (sender, e) =>\n\t\t\t{\n\t\t\t\tIsOn = NativeView.On;\n\t\t\t\tToggled?.Invoke(this);\n\t\t\t};\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/TabView.cs",
    "content": "using System.Collections.Specialized;\n\nnamespace Spice;\n\npublic partial class TabView\n{\n\t/// <summary>\n\t/// Implicit conversion to UITabBarController.\n\t/// </summary>\n\tpublic static implicit operator UITabBarController(TabView tabView) => tabView.TabBarController;\n\n\t/// <summary>\n\t/// TabView ctor - creates a UITabBarController\n\t/// </summary>\n\tpublic TabView() : base(_ => new UIView { AutoresizingMask = UIViewAutoresizing.All })\n\t{\n\t\tChildren.CollectionChanged += OnTabsChanged;\n\t}\n\n\tWeakReference<UITabBarController>? _tabBarController;\n\n\t/// <summary>\n\t/// Gets the underlying UITabBarController\n\t/// </summary>\n\tUITabBarController TabBarController\n\t{\n\t\tget\n\t\t{\n\t\t\tUITabBarController? controller = null;\n\t\t\tif (_tabBarController == null || !_tabBarController.TryGetTarget(out controller))\n\t\t\t{\n\t\t\t\tcontroller = new UITabBarController();\n\t\t\t\t_tabBarController = new WeakReference<UITabBarController>(controller);\n\t\t\t\tNativeView.AddSubview(controller.View!);\n\t\t\t\tcontroller.View!.Frame = NativeView.Bounds;\n\t\t\t\tcontroller.View!.AutoresizingMask = UIViewAutoresizing.All;\n\t\t\t}\n\t\t\treturn controller;\n\t\t}\n\t}\n\n\tvoid OnTabsChanged(object? sender, NotifyCollectionChangedEventArgs e)\n\t{\n\t\tUpdateTabs();\n\t}\n\n\tvoid UpdateTabs()\n\t{\n\t\tvar viewControllers = new List<UIViewController>();\n\n\t\tforeach (var child in Children)\n\t\t{\n\t\t\tif (child is Tab tab)\n\t\t\t{\n\t\t\t\ttab.EnsureContent();\n\t\t\t\t\n\t\t\t\tvar viewController = new UIViewController();\n\t\t\t\tif (tab.Content != null)\n\t\t\t\t{\n\t\t\t\t\tvar nativeContent = (UIView)tab.Content;\n\t\t\t\t\tviewController.View!.AddSubview(nativeContent);\n\t\t\t\t\tnativeContent.Frame = viewController.View.Bounds;\n\t\t\t\t\tnativeContent.AutoresizingMask = UIViewAutoresizing.All;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tviewController.Title = tab.Title;\n\t\t\t\t\n\t\t\t\t// Set tab bar item\n\t\t\t\tif (!string.IsNullOrEmpty(tab.Icon))\n\t\t\t\t{\n\t\t\t\t\tviewController.TabBarItem = new UITabBarItem(tab.Title, UIImage.FromBundle(tab.Icon), 0);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tviewController.TabBarItem = new UITabBarItem(tab.Title, null, 0);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tviewControllers.Add(viewController);\n\t\t\t}\n\t\t}\n\n\t\tTabBarController.ViewControllers = viewControllers.ToArray();\n\t}\n}\n\npublic partial class Tab\n{\n\t/// <summary>\n\t/// Tab ctor - tabs are logical containers, not views themselves\n\t/// </summary>\n\tpublic Tab() : base(_ => new UIView { AutoresizingMask = UIViewAutoresizing.None })\n\t{\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/TimePicker.cs",
    "content": "namespace Spice;\n\npublic partial class TimePicker\n{\n\t/// <summary>\n\t/// Returns timePicker.NativeView\n\t/// </summary>\n\t/// <param name=\"timePicker\">The Spice.TimePicker</param>\n\tpublic static implicit operator UIDatePicker(TimePicker timePicker) => timePicker.NativeView;\n\n\t/// <summary>\n\t/// Represents a control that allows the user to select a time value.\n\t/// Android -> Android.App.TimePickerDialog\n\t/// iOS -> UIKit.UIDatePicker (Mode = Time)\n\t/// </summary>\n\tpublic TimePicker() : base(_ => new UIDatePicker\n\t{\n\t\tAutoresizingMask = UIViewAutoresizing.None,\n\t\tMode = UIDatePickerMode.Time,\n\t\tPreferredDatePickerStyle = UIDatePickerStyle.Wheels\n\t})\n\t{\n\t\tNativeView.ValueChanged += OnNativeValueChanged;\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic TimePicker(CGRect frame) : base(_ => new UIDatePicker(frame)\n\t{\n\t\tAutoresizingMask = UIViewAutoresizing.None,\n\t\tMode = UIDatePickerMode.Time,\n\t\tPreferredDatePickerStyle = UIDatePickerStyle.Wheels\n\t})\n\t{\n\t\tNativeView.ValueChanged += OnNativeValueChanged;\n\t}\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected TimePicker(Func<View, UIView> creator) : base(creator) { }\n\n\t/// <summary>\n\t/// The underlying UIDatePicker\n\t/// </summary>\n\tpublic new UIDatePicker NativeView => (UIDatePicker)_nativeView.Value;\n\n\tpartial void OnTimeChanged(TimeOnly value)\n\t{\n\t\t// Convert TimeOnly to NSDate\n\t\tvar dateTime = DateTime.Today.Add(value.ToTimeSpan());\n\t\tNativeView.Date = (NSDate)dateTime;\n\t}\n\n\tvoid OnNativeValueChanged(object? sender, EventArgs e)\n\t{\n\t\t// Convert NSDate to TimeOnly\n\t\tvar dateTime = (DateTime)NativeView.Date;\n\t\tTime = TimeOnly.FromTimeSpan(dateTime.TimeOfDay);\n\t}\n}\n"
  },
  {
    "path": "src/Spice/Platforms/iOS/View.cs",
    "content": "﻿using System.Collections.Specialized;\nusing CoreFoundation;\nusing Foundation;\n\nnamespace Spice;\n\npublic partial class View\n{\n\t/// <summary>\n\t/// Returns view.NativeView\n\t/// </summary>\n\t/// <param name=\"view\">The Spice.View</param>\n\tpublic static implicit operator UIView(View view) => view.NativeView;\n\n\t/// <summary>\n\t/// View ctor\n\t/// </summary>\n\tpublic View() : this(_ => new UIView { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <summary>\n\t/// View ctor\n\t/// </summary>\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic View(CGRect frame) : this(_ => new UIView(frame) { AutoresizingMask = UIViewAutoresizing.None }) { }\n\n\t/// <summary>\n\t/// View ctor\n\t/// </summary>\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected View(Func<View, UIView> creator)\n\t{\n\t\t_nativeView = new Lazy<UIView>(() =>\n\t\t{\n\t\t\t// UIKit views must be created on the main thread\n\t\t\tif (NSThread.IsMain)\n\t\t\t\treturn creator(this);\n\n\t\t\tUIView? view = null;\n\t\t\tDispatchQueue.MainQueue.DispatchSync(() => view = creator(this));\n\t\t\treturn view!;\n\t\t});\n\n\t\tChildren.CollectionChanged += OnChildrenChanged;\n\t}\n\n\t/// <summary>\n\t/// Subclasses can access the underlying Lazy\n\t/// </summary>\n\tprotected readonly Lazy<UIView> _nativeView;\n\n\t/// <summary>\n\t/// The underlying UIView\n\t/// </summary>\n\tpublic UIView NativeView => _nativeView.Value;\n\n\t/// <summary>\n\t/// Subclasses can override when a view is added\n\t/// </summary>\n\t/// <param name=\"view\">The Spice.View</param>\n\tprotected virtual void AddSubview(View view)\n\t{\n\t\tNativeView.AddSubview(view);\n\t\tview.ApplyConstraints();\n\t}\n\n\tvoid OnChildrenChanged(object? sender, NotifyCollectionChangedEventArgs e)\n\t{\n\t\tif (e.OldItems != null)\n\t\t{\n\t\t\tforeach (View item in e.OldItems)\n\t\t\t{\n\t\t\t\t((UIView)item).RemoveFromSuperview();\n\t\t\t}\n\t\t}\n\n\t\tif (e.NewItems != null)\n\t\t{\n\t\t\tforeach (View item in e.NewItems)\n\t\t\t{\n\t\t\t\tAddSubview(item);\n\t\t\t}\n\t\t}\n\t}\n\n\tpartial void OnBackgroundColorChanged(Color? value) => NativeView.BackgroundColor = value.ToUIColor();\n\n\tpartial void OnVerticalOptionsChanged(LayoutOptions value) => ApplyConstraints();\n\n\tpartial void OnHorizontalOptionsChanged(LayoutOptions value) => ApplyConstraints();\n\n\tpartial void OnIsVisibleChanged(bool value) => NativeView.Hidden = !value;\n\n\tpartial void OnIsEnabledChanged(bool value) => NativeView.UserInteractionEnabled = value;\n\n\tpartial void OnOpacityChanged(double value) => NativeView.Alpha = (nfloat)value;\n\n\tpartial void OnAutomationIdChanged(string? value) => NativeView.AccessibilityIdentifier = value;\n\n\tpartial void OnMarginChanged(Thickness value) => ApplyConstraints();\n\n\tpartial void OnWidthRequestChanged(double value)\n\t{\n\t\t// Trigger layout update if the view is already in the view hierarchy\n\t\tif (NativeView.Superview != null)\n\t\t{\n\t\t\tApplyConstraints();\n\t\t}\n\t}\n\n\tpartial void OnHeightRequestChanged(double value)\n\t{\n\t\t// Trigger layout update if the view is already in the view hierarchy\n\t\tif (NativeView.Superview != null)\n\t\t{\n\t\t\tApplyConstraints();\n\t\t}\n\t}\n\n\tprivate partial double GetWidth() => (double)NativeView.Frame.Width;\n\n\tprivate partial double GetHeight() => (double)NativeView.Frame.Height;\n\n\tWeakReference<UIViewController>? _presentedViewController;\n\n\tprivate partial Task PresentAsyncCore(View view)\n\t{\n\t\tvar rootViewController = Platform.Window?.RootViewController;\n\t\tif (rootViewController == null)\n\t\t{\n\t\t\treturn Task.CompletedTask;\n\t\t}\n\n\t\t// Only present if this view is in the view hierarchy\n\t\tif (NativeView.Window == null)\n\t\t{\n\t\t\treturn Task.CompletedTask;\n\t\t}\n\n\t\tvar viewController = new UIViewController();\n\t\tvar nativeView = (UIView)view;\n\t\tviewController.View!.AddSubview(nativeView);\n\t\tConstraintHelper.PinEdges(nativeView, viewController.View!);\n\n\t\tif (!string.IsNullOrEmpty(view.Title))\n\t\t{\n\t\t\tviewController.Title = view.Title;\n\t\t}\n\n\t\t_presentedViewController = new WeakReference<UIViewController>(viewController);\n\n\t\treturn rootViewController.PresentViewControllerAsync(viewController, animated: true);\n\t}\n\n\tprivate partial Task DismissAsyncCore()\n\t{\n\t\tif (_presentedViewController != null && _presentedViewController.TryGetTarget(out var viewController))\n\t\t{\n\t\t\t_presentedViewController = null;\n\t\t\treturn viewController.DismissViewControllerAsync(animated: true);\n\t\t}\n\t\treturn Task.CompletedTask;\n\t}\n\n\tNSLayoutConstraint[]? _alignConstraints;\n\n\tinternal void ApplyConstraints()\n\t{\n\t\tvar view = NativeView;\n\t\tvar superview = view.Superview;\n\t\tif (superview == null || superview is UIStackView)\n\t\t\treturn;\n\n\t\t// Remove previous constraints\n\t\tConstraintHelper.RemoveConstraints(_alignConstraints);\n\n\t\t_alignConstraints = ConstraintHelper.ApplyAlignment(\n\t\t\tview,\n\t\t\tsuperview,\n\t\t\t_horizontalOptions.Alignment,\n\t\t\t_verticalOptions.Alignment,\n\t\t\t_margin,\n\t\t\t_widthRequest,\n\t\t\t_heightRequest);\n\t}\n\n\t// Keep for backward compatibility with callers\n\tinternal void UpdateAlign() => ApplyConstraints();\n}"
  },
  {
    "path": "src/Spice/Platforms/iOS/WebView.cs",
    "content": "﻿using WebKit;\n\nnamespace Spice;\n\npublic partial class WebView\n{\n\t/// <summary>\n\t/// Returns view.NativeView\n\t/// </summary>\n\t/// <param name=\"view\">The Spice.WebView</param>\n\tpublic static implicit operator WKWebView(WebView view) => view.NativeView;\n\n\tinternal static WKWebViewConfiguration CreateConfiguration()\n\t{\n\t\tvar config = new WKWebViewConfiguration();\n\n\t\t// By default, setting inline media playback to allowed, including autoplay\n\t\t// and picture in picture, since these things MUST be set during the webview\n\t\t// creation, and have no effect if set afterwards.\n\t\t// A custom handler factory delegate could be set to disable these defaults\n\t\t// but if we do not set them here, they cannot be changed once the\n\t\t// handler's platform view is created, so erring on the side of wanting this\n\t\t// capability by default.\n\t\tif (OperatingSystem.IsMacCatalystVersionAtLeast(10) || OperatingSystem.IsIOSVersionAtLeast(10))\n\t\t{\n\t\t\tconfig.AllowsPictureInPictureMediaPlayback = true;\n\t\t\tconfig.AllowsInlineMediaPlayback = true;\n\t\t\tconfig.MediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypes.None;\n\t\t}\n\n\t\treturn config;\n\t}\n\n\tinternal static WKWebView Create(CGRect frame, Func<WKWebViewConfiguration> createConfiguration)\n\t{\n\t\tvar view = new WKWebView(frame, createConfiguration())\n\t\t{\n\t\t\tAutoresizingMask = UIViewAutoresizing.None,\n\t\t};\n\t\treturn view;\n\t}\n\n\t/// <summary>\n\t/// A \"web view\" for rendering HTML content on each platform.\n\t/// Android -> Android.Webkit.WebView\n\t/// iOS -> WebKit.WKWebView\n\t/// </summary>\n\tpublic WebView() : this(_ => Create(CGRect.Empty, CreateConfiguration)) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"frame\">Pass the underlying view a frame</param>\n\tpublic WebView(CGRect frame) : this(_ => Create(frame, CreateConfiguration)) { }\n\n\t/// <inheritdoc />\n\t/// <param name=\"creator\">Subclasses can pass in a Func to create a UIView</param>\n\tprotected WebView(Func<View, UIView> creator) : base(creator) => Initialize();\n\n\t// Called by ctor\n\tvoid Initialize()\n\t{\n\t\t// Most users would want this default instead of center\n\t\tHorizontalOptions = LayoutOptions.Fill;\n\t\tVerticalOptions = LayoutOptions.Fill;\n\t}\n\n\t/// <summary>\n\t/// The underlying WebKit.WKWebView\n\t/// </summary>\n\tpublic new WKWebView NativeView => (WKWebView)_nativeView.Value;\n\n\tpartial void OnSourceChanged(string value) => NativeView.LoadRequest(new NSUrlRequest(new NSUrl(value)));\n\n\t/// <summary>\n\t/// Returns true if you can go back\n\t/// </summary>\n\tpublic bool CanGoBack => NativeView.CanGoBack;\n\n\t/// <summary>\n\t/// Navigates back if possible\n\t/// </summary>\n\tpublic void Back()\n\t{\n\t\tNativeView.GoBack();\n\t\tOnPropertyChanged(nameof(CanGoBack));\n\t}\n\n\t/// <summary>\n\t/// Returns true if you can go forward\n\t/// </summary>\n\tpublic bool CanGoForward => NativeView.CanGoForward;\n\n\t/// <summary>\n\t/// Navigates forward if possible\n\t/// </summary>\n\tpublic void Forward()\n\t{\n\t\tNativeView.GoForward();\n\t\tOnPropertyChanged(nameof(CanGoForward));\n\t}\n}\n\n"
  },
  {
    "path": "src/Spice/README.md",
    "content": "# Spice 🌶, a spicy cross-platform UI framework!\n\nA prototype (and design) of API minimalism for mobile.\n\nThe idea is we could build apps in a simple way, in a similar vein as\n[minimal APIs in ASP.NET Core][minimal-apis] but for mobile & maybe\none day desktop:\n\n```csharp\npublic class App : Application\n{\n    public App()\n    {\n        int count = 0;\n    \n        var label = new Label\n        {\n            Text = \"Hello, Spice 🌶\",\n        };\n    \n        var button = new Button\n        {\n            Text = \"Click Me\",\n            Clicked = _ => label.Text = $\"Times: {++count}\"\n        };\n    \n        Main = new StackLayout { label, button };\n    }\n}\n```\n\nThese \"view\" types are mostly just [POCOs][poco].\n\nThus you can easily write unit tests in a vanilla `net10.0` Xunit\nproject, such as:\n\n```csharp\n[Fact]\npublic void Application()\n{\n    var app = new App();\n    var label = (Label)app.Main.Children[0];\n    var button = (Button)app.Main.Children[1];\n\n    button.Clicked(button);\n    Assert.Equal(\"Times: 1\", label.Text);\n\n    button.Clicked(button);\n    Assert.Equal(\"Times: 2\", label.Text);\n}\n```\n\nThe above views in a `net10.0` project are not real UI, while\n`net10.0-android` and `net10.0-ios` projects get the full\nimplementations that actually *do* something on screen.\n\nSo for example, adding `App` to the screen on Android:\n\n```csharp\nprotected override void OnCreate(Bundle? savedInstanceState)\n{\n    base.OnCreate(savedInstanceState);\n\n    SetContentView(new App());\n}\n```\n\nAnd on iOS:\n\n```csharp\nvar vc = new UIViewController();\nvc.View.AddSubview(new App());\nWindow.RootViewController = vc;\n```\n\n`App` is a native view on both platforms. You just add it to an the\nscreen as you would any other control or view. This can be mix &\nmatched with regular iOS & Android UI because Spice 🌶 views are just\nnative views.\n\n[poco]: https://en.wikipedia.org/wiki/Plain_old_CLR_object\n[minimal-apis]: https://learn.microsoft.com/aspnet/core/fundamentals/minimal-apis\n\n## Getting Started\n\nSimply install the template:\n\n```bash\ndotnet new install Spice.Templates\n```\n\nCreate the project and build it as you would for other .NET MAUI\nprojects:\n\n```bash\ndotnet new spice\ndotnet build\n# To run on Android\ndotnet build -f net10.0-android -t:Run\n# To run on iOS\ndotnet build -f net10.0-ios -t:Run\n```\n\nOf course, you can also just open the project in Visual Studio and hit F5."
  },
  {
    "path": "src/Spice/Spice.csproj",
    "content": "<Project>\n\n\t<Import Project=\"MSBuild/Spice.props\" />\n\t<Import Sdk=\"Microsoft.NET.Sdk\" Project=\"Sdk.props\" />\n\n\t<PropertyGroup>\n\t\t<TargetFrameworks>net10.0;net10.0-android;net10.0-ios</TargetFrameworks>\n\t\t<Description>Spice 🌶, a spicy UI framework for mobile</Description>\n\t\t<IsPackable>true</IsPackable>\n\t\t<GenerateDocumentationFile>true</GenerateDocumentationFile>\n\t\t<ImplicitUsings>enable</ImplicitUsings>\n\t\t<Nullable>enable</Nullable>\n\t\t<SingleProject>true</SingleProject>\n\t\t<IsTrimmable>true</IsTrimmable>\n\t\t<IsAotCompatible>true</IsAotCompatible>\n\t\t<EnableTrimAnalyzer>true</EnableTrimAnalyzer>\n\t\t<EnableSingleFileAnalyzer>true</EnableSingleFileAnalyzer>\n\t\t<EnableAotAnalyzer>true</EnableAotAnalyzer>\n\t\t<AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n\t\t<SupportedOSPlatformVersion Condition=\"$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'\">16.0</SupportedOSPlatformVersion>\n\t\t<SupportedOSPlatformVersion Condition=\"$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'\">21.0</SupportedOSPlatformVersion>\n\t\t<DefineConstants Condition=\" '$(TargetFramework)' == 'net10.0' \">$(DefineConstants);VANILLA</DefineConstants>\n\t\t<SpiceEnablePlatformUsings>true</SpiceEnablePlatformUsings>\n\t\t<AndroidGenerateResourceDesigner>false</AndroidGenerateResourceDesigner>\n\t\t<_UseLegacyJavadocImport>true</_UseLegacyJavadocImport>\n\t</PropertyGroup>\n\n\t<ItemGroup>\n\t\t<None Include=\"../../LICENSE\" Pack=\"true\" PackagePath=\"\" />\n\t\t<None Include=\"README.md\" Pack=\"true\" PackagePath=\"\" />\n\t\t<None Include=\"../../docs/icon.png\" Pack=\"true\" PackagePath=\"\" />\n\t\t<None Include=\"MSBuild/**\" Pack=\"true\" PackagePath=\"build;buildTransitive\" />\n\t\t<PackageReference Include=\"CommunityToolkit.Mvvm\" Version=\"8.4.0\" />\n\t\t<PackageReference Include=\"Microsoft.Maui.Graphics\" Version=\"10.0.40\" />\n\t\t<PackageReference Include=\"Microsoft.AspNetCore.Components.WebView\" Version=\"10.0.3\" />\n\t\t<PackageReference Include=\"MemoryAnalyzers\" Version=\"0.1.0-beta.5\">\n\t\t\t<PrivateAssets>all</PrivateAssets>\n\t\t\t<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>\n\t\t</PackageReference>\n\t</ItemGroup>\n\n\t<ItemGroup Condition=\" '$(TargetPlatformIdentifier)' == 'Android' \">\n\t\t<PackageReference Include=\"Xamarin.AndroidX.AppCompat\" Version=\"1.6.1.10\" />\n\t\t<PackageReference Include=\"Xamarin.AndroidX.SwipeRefreshLayout\" Version=\"1.1.0.21\" />\n\t\t<PackageReference Include=\"Xamarin.Google.Android.Material\" Version=\"1.10.0.6\" />\n\t\t<AndroidJavaSource Include=\"Platforms/Android/*.java\" />\n\t\t<TransformFile Include=\"Platforms/Android/Transforms.xml\" />\n\t</ItemGroup>\n\n\t<Import Sdk=\"Microsoft.NET.Sdk\" Project=\"Sdk.targets\" />\n\t<Import Project=\"MSBuild/Spice.targets\" />\n\n</Project>\n"
  },
  {
    "path": "src/Spice.Templates/Spice.Templates.csproj",
    "content": "<Project Sdk=\"Microsoft.Build.NoTargets\">\n  <PropertyGroup>\n    <TargetFramework>net10.0</TargetFramework>\n    <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>\n    <Description>Templates for Spice 🌶, a spicy UI framework for mobile</Description>\n    <IsPackable>true</IsPackable>\n    <PackageType>Template</PackageType>\n    <IncludeContentInPack>true</IncludeContentInPack>\n    <IncludeBuildOutput>false</IncludeBuildOutput>\n    <ContentTargetFolders>content</ContentTargetFolders>\n    <GenerateDependencyFile>false</GenerateDependencyFile>\n    <!-- This project has no .NET assemblies, so disable the warning for that -->\n    <NoWarn>$(NoWarn);NU5128</NoWarn>\n    <!-- Remove the `<group targetFramework=\"...\" />` entry from the .nuspec. -->\n    <SuppressDependenciesWhenPacking>true</SuppressDependenciesWhenPacking>\n  </PropertyGroup>\n  <ItemGroup>\n    <None Include=\"../../LICENSE\" Pack=\"true\" PackagePath=\"\" />\n    <None Include=\"../../src/Spice/README.md\" Pack=\"true\" PackagePath=\"\" />\n    <None Include=\"../../docs/icon.png\" Pack=\"true\" PackagePath=\"\" />\n    <Content Include=\"templates/**/*\" />\n    <Compile Remove=\"**/*\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/Spice.Templates/templates/spice/.template.config/template.json",
    "content": "{\n    \"$schema\": \"http://json.schemastore.org/template\",\n    \"author\": \"Jonathan Peppers\",\n    \"classifications\": [ \"MAUI\", \"Android\", \"iOS\" ],\n    \"identity\": \"Spice.templates.spice\",\n    \"name\": \"Spice application\",\n    \"description\": \"A project for creating cross-platform applications in C#\",\n    \"shortName\": \"spice\",\n    \"tags\": {\n      \"language\": \"C#\",\n      \"type\": \"project\"\n    },\n    \"sourceName\": \"Hello\",\n    \"sources\": [\n        {\n          \"source\": \"./\",\n          \"target\": \"./\",\n          \"copyOnly\": \"**/*.svg\"\n        }\n    ],\n    \"preferNameDirectory\": true,\n    \"primaryOutputs\": [\n      { \"path\": \"Hello.csproj\" }\n    ],\n    \"defaultName\": \"Hello\"\n}"
  },
  {
    "path": "src/Spice.Templates/templates/spice/App.cs",
    "content": "﻿namespace Hello;\n\npublic class App : Application\n{\n\tpublic App()\n\t{\n\t\tUseSystemTheme = true;\n\n\t\tint count = 0;\n\n\t\tvar label = new Label\n\t\t{\n\t\t\tText = \"Spicy! 🌶\",\n\t\t};\n\n\t\tvar button = new Button\n\t\t{\n\t\t\tText = \"Click Me\",\n\t\t\tClicked = _ => label.Text = $\"Times: {++count}\"\n\t\t};\n\n\t\tMain = new StackLayout { new Image { Source = \"spice\" }, label, button };\n\t}\n}"
  },
  {
    "path": "src/Spice.Templates/templates/spice/GlobalUsings.cs",
    "content": "﻿global using Microsoft.Maui.Graphics;\nglobal using Spice;\n"
  },
  {
    "path": "src/Spice.Templates/templates/spice/Hello.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>net10.0-android;net10.0-ios</TargetFrameworks>\n    <OutputType>Exe</OutputType>\n    <UseMauiAssets>true</UseMauiAssets>\n    <SingleProject>true</SingleProject>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n    <ApplicationTitle>Hello</ApplicationTitle>\n    <ApplicationId>com.companyname.Hello</ApplicationId>\n    <ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>\n    <ApplicationVersion>1</ApplicationVersion>\n    <SupportedOSPlatformVersion Condition=\"$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'\">16.0</SupportedOSPlatformVersion>\n    <SupportedOSPlatformVersion Condition=\"$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'\">21.0</SupportedOSPlatformVersion>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <!-- App Icon -->\n    <MauiIcon Include=\"Resources\\AppIcon\\appicon.svg\" ForegroundFile=\"Resources\\AppIcon\\appiconfg.svg\" Color=\"#512BD4\" />\n\n    <!-- Splash Screen -->\n    <MauiSplashScreen Include=\"Resources\\Splash\\splash.svg\" Color=\"#512BD4\" BaseSize=\"128,128\" />\n\n    <!-- Images -->\n    <MauiImage Include=\"Resources\\Images\\*\" />\n    <MauiImage Update=\"Resources\\Images\\spice.svg\" BaseSize=\"168,208\" />\n\n    <!-- Custom Fonts -->\n    <MauiFont Include=\"Resources\\Fonts\\*\" />\n\n    <!-- Raw Assets (also remove the \"Resources\\Raw\" prefix) -->\n    <MauiAsset Include=\"Resources\\Raw\\**\" LogicalName=\"%(RecursiveDir)%(Filename)%(Extension)\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Spice\" Version=\"*-*\" />\n    <PackageReference Include=\"Microsoft.Maui.Resizetizer\" Version=\"$(MauiVersion)\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/Spice.Templates/templates/spice/Platforms/Android/AndroidManifest.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\t<application android:allowBackup=\"true\" android:icon=\"@mipmap/appicon\" android:roundIcon=\"@mipmap/appicon_round\" android:supportsRtl=\"true\"></application>\n\t<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n\t<uses-permission android:name=\"android.permission.INTERNET\" />\n</manifest>"
  },
  {
    "path": "src/Spice.Templates/templates/spice/Platforms/Android/MainActivity.cs",
    "content": "﻿using Android.App;\nusing Android.OS;\n\nnamespace Hello;\n\n[Activity(\n\tTheme = \"@style/Theme.Material3.Light.NoActionBar\",\n\tMainLauncher = true)]\npublic class MainActivity : SpiceActivity\n{\n\tprotected override void OnCreate(Bundle? savedInstanceState)\n\t{\n\t\tbase.OnCreate(savedInstanceState);\n\n\t\tSetContentView(new App());\n\t}\n}"
  },
  {
    "path": "src/Spice.Templates/templates/spice/Platforms/iOS/AppDelegate.cs",
    "content": "﻿using Foundation;\n\nnamespace Hello;\n\n[Register(\"AppDelegate\")]\npublic class AppDelegate : SpiceAppDelegate\n{\n\tpublic override Application CreateApplication() => new App();\n}"
  },
  {
    "path": "src/Spice.Templates/templates/spice/Platforms/iOS/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIDeviceFamily</key>\n\t<array>\n\t\t<integer>1</integer>\n\t\t<integer>2</integer>\n\t</array>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>arm64</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>XSAppIconAssets</key>\n\t<string>Assets.xcassets/appicon.appiconset</string>\n\t<key>UIApplicationSceneManifest</key>\n\t<dict>\n\t\t<key>UIApplicationSupportsMultipleScenes</key>\n\t\t<false/>\n\t\t<key>UISceneConfigurations</key>\n\t\t<dict>\n\t\t\t<key>UIWindowSceneSessionRoleApplication</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>UISceneConfigurationName</key>\n\t\t\t\t\t<string>Default Configuration</string>\n\t\t\t\t\t<key>UISceneDelegateClassName</key>\n\t\t\t\t\t<string>SpiceSceneDelegate</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "src/Spice.Templates/templates/spice/Platforms/iOS/Program.cs",
    "content": "﻿using UIKit;\nusing Hello;\n\nUIApplication.Main(args, null, typeof(AppDelegate));"
  },
  {
    "path": "src/Spice.Templates/templates/spice-blazor/.template.config/template.json",
    "content": "{\n    \"$schema\": \"http://json.schemastore.org/template\",\n    \"author\": \"Jonathan Peppers\",\n    \"classifications\": [ \"MAUI\", \"Android\", \"iOS\" ],\n    \"identity\": \"Spice.templates.spice.blazor\",\n    \"name\": \"Spice Blazor application\",\n    \"description\": \"A project for creating cross-platform hybrid applications with C# and Blazor\",\n    \"shortName\": \"spice-blazor\",\n    \"tags\": {\n      \"language\": \"C#\",\n      \"type\": \"project\"\n    },\n    \"sourceName\": \"HelloBlazor\",\n    \"sources\": [\n        {\n          \"source\": \"./\",\n          \"target\": \"./\",\n          \"copyOnly\": [ \"**/wwwroot/css/**\", \"**/*.svg\" ]\n        }\n    ],\n    \"preferNameDirectory\": true,\n    \"primaryOutputs\": [\n      { \"path\": \"HelloBlazor.csproj\" }\n    ],\n    \"defaultName\": \"HelloBlazor\"\n}"
  },
  {
    "path": "src/Spice.Templates/templates/spice-blazor/App.cs",
    "content": "﻿namespace HelloBlazor;\n\npublic class App : Application\n{\n\tpublic App()\n\t{\n\t\tMain = new BlazorWebView\n\t\t{\n\t\t\tHostPage = \"wwwroot/index.html\",\n\t\t\tRootComponents =\n\t\t\t{\n\t\t\t\tnew RootComponent { Selector = \"#app\", ComponentType = typeof(Main) }\n\t\t\t},\n\t\t};\n\t}\n}"
  },
  {
    "path": "src/Spice.Templates/templates/spice-blazor/GlobalUsings.cs",
    "content": "﻿global using Microsoft.Maui.Graphics;\nglobal using Spice;\n"
  },
  {
    "path": "src/Spice.Templates/templates/spice-blazor/HelloBlazor.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.Razor\">\n\n  <PropertyGroup>\n    <TargetFrameworks>net10.0-android;net10.0-ios</TargetFrameworks>\n    <OutputType>Exe</OutputType>\n    <UseMauiAssets>true</UseMauiAssets>\n    <SingleProject>true</SingleProject>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n    <EnableDefaultCssItems>false</EnableDefaultCssItems>\n    <!-- https://github.com/dotnet/aspnetcore/issues/63951 — Blazor doesn't support full trimming -->\n    <NoWarn>$(NoWarn);IL2026;IL2065;IL2067;IL2072;IL2104;IL2110;IL2111;IL2121</NoWarn>\n    <ApplicationTitle>HelloBlazor</ApplicationTitle>\n    <ApplicationId>com.companyname.HelloBlazor</ApplicationId>\n    <ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>\n    <ApplicationVersion>1</ApplicationVersion>\n    <SupportedOSPlatformVersion Condition=\"$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'\">16.0</SupportedOSPlatformVersion>\n    <SupportedOSPlatformVersion Condition=\"$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'\">23.0</SupportedOSPlatformVersion>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <!-- App Icon -->\n    <MauiIcon Include=\"Resources\\AppIcon\\appicon.svg\" ForegroundFile=\"Resources\\AppIcon\\appiconfg.svg\" Color=\"#512BD4\" />\n\n    <!-- Splash Screen -->\n    <MauiSplashScreen Include=\"Resources\\Splash\\splash.svg\" Color=\"#512BD4\" BaseSize=\"128,128\" />\n\n    <!-- Images -->\n    <MauiImage Include=\"Resources\\Images\\*\" />\n    <MauiImage Update=\"Resources\\Images\\spice.svg\" BaseSize=\"168,208\" />\n\n    <!-- Custom Fonts -->\n    <MauiFont Include=\"Resources\\Fonts\\*\" />\n\n    <!-- Raw Assets (also remove the \"Resources\\Raw\" prefix) -->\n    <MauiAsset Include=\"Resources\\Raw\\**\" LogicalName=\"%(RecursiveDir)%(Filename)%(Extension)\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Spice\" Version=\"*-*\" />\n    <PackageReference Include=\"Microsoft.Maui.Resizetizer\" Version=\"$(MauiVersion)\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/Spice.Templates/templates/spice-blazor/Main.razor",
    "content": "<Router AppAssembly=\"typeof(Main).Assembly\">\n    <Found Context=\"routeData\">\n        <RouteView RouteData=\"routeData\" DefaultLayout=\"typeof(MainLayout)\" />\n        <FocusOnNavigate RouteData=\"routeData\" Selector=\"h1\" />\n    </Found>\n    <NotFound>\n        <p role=\"alert\">Sorry, there's nothing at this address.</p>\n    </NotFound>\n</Router>"
  },
  {
    "path": "src/Spice.Templates/templates/spice-blazor/Pages/Index.razor",
    "content": "﻿@page \"/\"\n\n<h1>Hello, Spice + Blazor 🌶!</h1>\n\nWelcome to your new app."
  },
  {
    "path": "src/Spice.Templates/templates/spice-blazor/Platforms/Android/AndroidManifest.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\t<application android:allowBackup=\"true\" android:icon=\"@mipmap/appicon\" android:roundIcon=\"@mipmap/appicon_round\" android:supportsRtl=\"true\"></application>\n\t<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n\t<uses-permission android:name=\"android.permission.INTERNET\" />\n</manifest>"
  },
  {
    "path": "src/Spice.Templates/templates/spice-blazor/Platforms/Android/MainActivity.cs",
    "content": "﻿using Android.App;\nusing Android.OS;\n\nnamespace HelloBlazor;\n\n[Activity(\n\t// TODO: fix splash theme\n\t// Theme = \"@style/Maui.SplashTheme\", \n\tTheme = \"@style/Theme.Material3.Light.NoActionBar\",\n\tMainLauncher = true)]\npublic class MainActivity : SpiceActivity\n{\n\tprotected override void OnCreate(Bundle? savedInstanceState)\n\t{\n\t\tbase.OnCreate(savedInstanceState);\n\n\t\tSetContentView(new App());\n\t}\n}"
  },
  {
    "path": "src/Spice.Templates/templates/spice-blazor/Platforms/iOS/AppDelegate.cs",
    "content": "﻿using Foundation;\n\nnamespace HelloBlazor;\n\n[Register(\"AppDelegate\")]\npublic class AppDelegate : SpiceAppDelegate\n{\n\tpublic override Application CreateApplication() => new App();\n}"
  },
  {
    "path": "src/Spice.Templates/templates/spice-blazor/Platforms/iOS/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIDeviceFamily</key>\n\t<array>\n\t\t<integer>1</integer>\n\t\t<integer>2</integer>\n\t</array>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>arm64</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>XSAppIconAssets</key>\n\t<string>Assets.xcassets/appicon.appiconset</string>\n\t<key>UIApplicationSceneManifest</key>\n\t<dict>\n\t\t<key>UIApplicationSupportsMultipleScenes</key>\n\t\t<false/>\n\t\t<key>UISceneConfigurations</key>\n\t\t<dict>\n\t\t\t<key>UIWindowSceneSessionRoleApplication</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>UISceneConfigurationName</key>\n\t\t\t\t\t<string>Default Configuration</string>\n\t\t\t\t\t<key>UISceneDelegateClassName</key>\n\t\t\t\t\t<string>SpiceSceneDelegate</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "src/Spice.Templates/templates/spice-blazor/Platforms/iOS/Program.cs",
    "content": "﻿using UIKit;\nusing HelloBlazor;\n\nUIApplication.Main(args, null, typeof(AppDelegate));"
  },
  {
    "path": "src/Spice.Templates/templates/spice-blazor/Shared/MainLayout.razor",
    "content": "@inherits LayoutComponentBase\n\n<div class=\"page\">\n    <div class=\"sidebar\">\n        <NavMenu />\n    </div>\n\n    <main>\n        <div class=\"top-row px-4\">\n            <a href=\"https://docs.microsoft.com/aspnet/\" target=\"_blank\">About</a>\n        </div>\n\n        <article class=\"content px-4\">\n            @Body\n        </article>\n    </main>\n</div>\n"
  },
  {
    "path": "src/Spice.Templates/templates/spice-blazor/Shared/MainLayout.razor.css",
    "content": ".page {\n    position: relative;\n    display: flex;\n    flex-direction: column;\n}\n\nmain {\n    flex: 1;\n}\n\n.sidebar {\n    background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);\n}\n\n.top-row {\n    background-color: #f7f7f7;\n    border-bottom: 1px solid #d6d5d5;\n    justify-content: flex-end;\n    height: 3.5rem;\n    display: flex;\n    align-items: center;\n}\n\n    .top-row ::deep a, .top-row ::deep .btn-link {\n        white-space: nowrap;\n        margin-left: 1.5rem;\n        text-decoration: none;\n    }\n\n    .top-row ::deep a:hover, .top-row ::deep .btn-link:hover {\n        text-decoration: underline;\n    }\n\n    .top-row ::deep a:first-child {\n        overflow: hidden;\n        text-overflow: ellipsis;\n    }\n\n@media (max-width: 640.98px) {\n    .top-row:not(.auth) {\n        display: none;\n    }\n\n    .top-row.auth {\n        justify-content: space-between;\n    }\n\n    .top-row ::deep a, .top-row ::deep .btn-link {\n        margin-left: 0;\n    }\n}\n\n@media (min-width: 641px) {\n    .page {\n        flex-direction: row;\n    }\n\n    .sidebar {\n        width: 250px;\n        height: 100vh;\n        position: sticky;\n        top: 0;\n    }\n\n    .top-row {\n        position: sticky;\n        top: 0;\n        z-index: 1;\n    }\n\n    .top-row, article {\n        padding-left: 2rem !important;\n        padding-right: 1.5rem !important;\n    }\n}\n"
  },
  {
    "path": "src/Spice.Templates/templates/spice-blazor/Shared/NavMenu.razor",
    "content": "<div class=\"top-row ps-3 navbar navbar-dark\">\n    <div class=\"container-fluid\">\n        <a class=\"navbar-brand\" href=\"\">HelloBlazor</a>\n        <button title=\"Navigation menu\" class=\"navbar-toggler\" @onclick=\"ToggleNavMenu\">\n            <span class=\"navbar-toggler-icon\"></span>\n        </button>\n    </div>\n</div>\n\n<div class=\"@NavMenuCssClass\" @onclick=\"ToggleNavMenu\">\n    <nav class=\"flex-column\">\n        <div class=\"nav-item px-3\">\n            <NavLink class=\"nav-link\" href=\"\" Match=\"NavLinkMatch.All\">\n                <span class=\"oi oi-home\" aria-hidden=\"true\"></span> Home\n            </NavLink>\n        </div>\n    </nav>\n</div>\n\n@code {\n    private bool collapseNavMenu = true;\n\n    private string NavMenuCssClass => collapseNavMenu ? \"collapse\" : \"\";\n\n    private void ToggleNavMenu()\n    {\n        collapseNavMenu = !collapseNavMenu;\n    }\n}\n"
  },
  {
    "path": "src/Spice.Templates/templates/spice-blazor/Shared/NavMenu.razor.css",
    "content": ".navbar-toggler {\n    background-color: rgba(255, 255, 255, 0.1);\n}\n\n.top-row {\n    height: 3.5rem;\n    background-color: rgba(0,0,0,0.4);\n}\n\n.navbar-brand {\n    font-size: 1.1rem;\n}\n\n.oi {\n    width: 2rem;\n    font-size: 1.1rem;\n    vertical-align: text-top;\n    top: -2px;\n}\n\n.nav-item {\n    font-size: 0.9rem;\n    padding-bottom: 0.5rem;\n}\n\n    .nav-item:first-of-type {\n        padding-top: 1rem;\n    }\n\n    .nav-item:last-of-type {\n        padding-bottom: 1rem;\n    }\n\n    .nav-item ::deep a {\n        color: #d7d7d7;\n        border-radius: 4px;\n        height: 3rem;\n        display: flex;\n        align-items: center;\n        line-height: 3rem;\n    }\n\n.nav-item ::deep a.active {\n    background-color: rgba(255,255,255,0.25);\n    color: white;\n}\n\n.nav-item ::deep a:hover {\n    background-color: rgba(255,255,255,0.1);\n    color: white;\n}\n\n@media (min-width: 641px) {\n    .navbar-toggler {\n        display: none;\n    }\n\n    .collapse {\n        /* Never collapse the sidebar for wide screens */\n        display: block;\n    }\n}\n"
  },
  {
    "path": "src/Spice.Templates/templates/spice-blazor/_Imports.razor",
    "content": "﻿@using System.Net.Http\n@using Microsoft.AspNetCore.Components.Forms\n@using Microsoft.AspNetCore.Components.Routing\n@using Microsoft.AspNetCore.Components.Web\n@using Microsoft.AspNetCore.Components.Web.Virtualization\n@using Microsoft.JSInterop\n@using HelloBlazor\n@using HelloBlazor.Shared"
  },
  {
    "path": "src/Spice.Templates/templates/spice-blazor/wwwroot/css/app.css",
    "content": "﻿@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');\n\nhtml, body {\n    font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n}\n\nh1:focus {\n    outline: none;\n}\n\na, .btn-link {\n    color: #0071c1;\n}\n\n.btn-primary {\n    color: #fff;\n    background-color: #1b6ec2;\n    border-color: #1861ac;\n}\n\n.content {\n    padding-top: 1.1rem;\n}\n\n.valid.modified:not([type=checkbox]) {\n    outline: 1px solid #26b050;\n}\n\n.invalid {\n    outline: 1px solid red;\n}\n\n.validation-message {\n    color: red;\n}\n\n#blazor-error-ui {\n    background: lightyellow;\n    bottom: 0;\n    box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);\n    display: none;\n    left: 0;\n    padding: 0.6rem 1.25rem 0.7rem 1.25rem;\n    position: fixed;\n    width: 100%;\n    z-index: 1000;\n}\n\n#blazor-error-ui .dismiss {\n    cursor: pointer;\n    position: absolute;\n    right: 0.75rem;\n    top: 0.5rem;\n}\n\n.blazor-error-boundary {\n    background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;\n    padding: 1rem 1rem 1rem 3.7rem;\n    color: white;\n}\n\n.blazor-error-boundary::after {\n    content: \"An error has occurred.\"\n}\n\n.status-bar-safe-area {\n    display: none;\n}\n\n@supports (-webkit-touch-callout: none) {\n    .status-bar-safe-area {\n        display: flex;\n        position: sticky;\n        top: 0;\n        height: env(safe-area-inset-top);\n        background-color: #f7f7f7;\n        width: 100%;\n        z-index: 1;\n    }\n\n    .flex-column, .navbar-brand {\n        padding-left: env(safe-area-inset-left);\n    }\n}\n"
  },
  {
    "path": "src/Spice.Templates/templates/spice-blazor/wwwroot/css/open-iconic/FONT-LICENSE",
    "content": "SIL OPEN FONT LICENSE Version 1.1\n\nCopyright (c) 2014 Waybury\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to stimulate worldwide\ndevelopment of collaborative font projects, to support the font creation\nefforts of academic and linguistic communities, and to provide a free and\nopen framework in which fonts may be shared and improved in partnership\nwith others.\n\nThe OFL allows the licensed fonts to be used, studied, modified and\nredistributed freely as long as they are not sold by themselves. The\nfonts, including any derivative works, can be bundled, embedded,\nredistributed and/or sold with any software provided that any reserved\nnames are not used by derivative works. The fonts and derivatives,\nhowever, cannot be released under any other type of license. The\nrequirement for fonts to remain under this license does not apply\nto any document created using the fonts or their derivatives.\n\nDEFINITIONS\n\"Font Software\" refers to the set of files released by the Copyright\nHolder(s) under this license and clearly marked as such. This may\ninclude source files, build scripts and documentation.\n\n\"Reserved Font Name\" refers to any names specified as such after the\ncopyright statement(s).\n\n\"Original Version\" refers to the collection of Font Software components as\ndistributed by the Copyright Holder(s).\n\n\"Modified Version\" refers to any derivative made by adding to, deleting,\nor substituting -- in part or in whole -- any of the components of the\nOriginal Version, by changing formats or by porting the Font Software to a\nnew environment.\n\n\"Author\" refers to any designer, engineer, programmer, technical\nwriter or other person who contributed to the Font Software.\n\nPERMISSION & CONDITIONS\nPermission is hereby granted, free of charge, to any person obtaining\na copy of the Font Software, to use, study, copy, merge, embed, modify,\nredistribute, and sell modified and unmodified copies of the Font\nSoftware, subject to the following conditions:\n\n1) Neither the Font Software nor any of its individual components,\nin Original or Modified Versions, may be sold by itself.\n\n2) Original or Modified Versions of the Font Software may be bundled,\nredistributed and/or sold with any software, provided that each copy\ncontains the above copyright notice and this license. These can be\nincluded either as stand-alone text files, human-readable headers or\nin the appropriate machine-readable metadata fields within text or\nbinary files as long as those fields can be easily viewed by the user.\n\n3) No Modified Version of the Font Software may use the Reserved Font\nName(s) unless explicit written permission is granted by the corresponding\nCopyright Holder. This restriction only applies to the primary font name as\npresented to the users.\n\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\nSoftware shall not be used to promote, endorse or advertise any\nModified Version, except to acknowledge the contribution(s) of the\nCopyright Holder(s) and the Author(s) or with their explicit written\npermission.\n\n5) The Font Software, modified or unmodified, in part or in whole,\nmust be distributed entirely under this license, and must not be\ndistributed under any other license. The requirement for fonts to\nremain under this license does not apply to any document created\nusing the Font Software.\n\nTERMINATION\nThis license becomes null and void if any of the above conditions are\nnot met.\n\nDISCLAIMER\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\nOTHER DEALINGS IN THE FONT SOFTWARE.\n"
  },
  {
    "path": "src/Spice.Templates/templates/spice-blazor/wwwroot/css/open-iconic/ICON-LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Waybury\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "src/Spice.Templates/templates/spice-blazor/wwwroot/css/open-iconic/README.md",
    "content": "[Open Iconic v1.1.1](https://github.com/iconic/open-iconic)\n===========\n\n### Open Iconic is the open source sibling of [Iconic](https://github.com/iconic/open-iconic). It is a hyper-legible collection of 223 icons with a tiny footprint&mdash;ready to use with Bootstrap and Foundation. [View the collection](https://github.com/iconic/open-iconic)\n\n\n\n## What's in Open Iconic?\n\n* 223 icons designed to be legible down to 8 pixels\n* Super-light SVG files - 61.8 for the entire set \n* SVG sprite&mdash;the modern replacement for icon fonts\n* Webfont (EOT, OTF, SVG, TTF, WOFF), PNG and WebP formats\n* Webfont stylesheets (including versions for Bootstrap and Foundation) in CSS, LESS, SCSS and Stylus formats\n* PNG and WebP raster images in 8px, 16px, 24px, 32px, 48px and 64px.\n\n\n## Getting Started\n\n#### For code samples and everything else you need to get started with Open Iconic, check out our [Icons](https://github.com/iconic/open-iconic) and [Reference](https://github.com/iconic/open-iconic) sections.\n\n### General Usage\n\n#### Using Open Iconic's SVGs\n\nWe like SVGs and we think they're the way to display icons on the web. Since Open Iconic are just basic SVGs, we suggest you display them like you would any other image (don't forget the `alt` attribute).\n\n```\n<img src=\"/open-iconic/svg/icon-name.svg\" alt=\"icon name\">\n```\n\n#### Using Open Iconic's SVG Sprite\n\nOpen Iconic also comes in a SVG sprite which allows you to display all the icons in the set with a single request. It's like an icon font, without being a hack.\n\nAdding an icon from an SVG sprite is a little different than what you're used to, but it's still a piece of cake. *Tip: To make your icons easily style able, we suggest adding a general class to the* `<svg>` *tag and a unique class name for each different icon in the* `<use>` *tag.*  \n\n```\n<svg class=\"icon\">\n  <use xlink:href=\"open-iconic.svg#account-login\" class=\"icon-account-login\"></use>\n</svg>\n```\n\nSizing icons only needs basic CSS. All the icons are in a square format, so just set the `<svg>` tag with equal width and height dimensions.\n\n```\n.icon {\n  width: 16px;\n  height: 16px;\n}\n```\n\nColoring icons is even easier. All you need to do is set the `fill` rule on the `<use>` tag.\n\n```\n.icon-account-login {\n  fill: #f00;\n}\n```\n\nTo learn more about SVG Sprites, read [Chris Coyier's guide](http://css-tricks.com/svg-sprites-use-better-icon-fonts/).\n\n#### Using Open Iconic's Icon Font...\n\n\n##### …with Bootstrap\n\nYou can find our Bootstrap stylesheets in `font/css/open-iconic-bootstrap.{css, less, scss, styl}`\n\n\n```\n<link href=\"/open-iconic/font/css/open-iconic-bootstrap.css\" rel=\"stylesheet\">\n```\n\n\n```\n<span class=\"oi oi-icon-name\" title=\"icon name\" aria-hidden=\"true\"></span>\n```\n\n##### …with Foundation\n\nYou can find our Foundation stylesheets in `font/css/open-iconic-foundation.{css, less, scss, styl}`\n\n```\n<link href=\"/open-iconic/font/css/open-iconic-foundation.css\" rel=\"stylesheet\">\n```\n\n\n```\n<span class=\"fi-icon-name\" title=\"icon name\" aria-hidden=\"true\"></span>\n```\n\n##### …on its own\n\nYou can find our default stylesheets in `font/css/open-iconic.{css, less, scss, styl}`\n\n```\n<link href=\"/open-iconic/font/css/open-iconic.css\" rel=\"stylesheet\">\n```\n\n```\n<span class=\"oi\" data-glyph=\"icon-name\" title=\"icon name\" aria-hidden=\"true\"></span>\n```\n\n\n## License\n\n### Icons\n\nAll code (including SVG markup) is under the [MIT License](http://opensource.org/licenses/MIT).\n\n### Fonts\n\nAll fonts are under the [SIL Licensed](http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web).\n"
  },
  {
    "path": "src/Spice.Templates/templates/spice-blazor/wwwroot/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover\" />\n    <title>HelloBlazor</title>\n    <base href=\"/\" />\n    <link rel=\"stylesheet\" href=\"css/bootstrap/bootstrap.min.css\" />\n    <link href=\"css/app.css\" rel=\"stylesheet\" />\n    <link href=\"HelloBlazor.styles.css\" rel=\"stylesheet\" />\n</head>\n\n<body>\n\n    <div class=\"status-bar-safe-area\"></div>\n\n    <div id=\"app\">Loading...</div>\n\n    <div id=\"blazor-error-ui\">\n        An unhandled error has occurred.\n        <a href=\"\" class=\"reload\">Reload</a>\n        <a class=\"dismiss\">🗙</a>\n    </div>\n\n    <script src=\"_framework/blazor.webview.js\" autostart=\"false\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "tests/Spice.Tests/ActivityIndicatorTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for ActivityIndicator control\n/// </summary>\npublic class ActivityIndicatorTests\n{\n\t[Fact]\n\tpublic void ActivityIndicatorCreation()\n\t{\n\t\tvar activityIndicator = new ActivityIndicator();\n\t\tAssert.NotNull(activityIndicator);\n\t\tAssert.False(activityIndicator.IsRunning);\n\t\tAssert.Null(activityIndicator.Color);\n\t}\n\n\t[Fact]\n\tpublic void IsRunningProperty()\n\t{\n\t\tvar activityIndicator = new ActivityIndicator();\n\t\tAssert.False(activityIndicator.IsRunning);\n\n\t\tactivityIndicator.IsRunning = true;\n\t\tAssert.True(activityIndicator.IsRunning);\n\n\t\tactivityIndicator.IsRunning = false;\n\t\tAssert.False(activityIndicator.IsRunning);\n\t}\n\n\t[Fact]\n\tpublic void ColorProperty()\n\t{\n\t\tvar activityIndicator = new ActivityIndicator();\n\t\tAssert.Null(activityIndicator.Color);\n\n\t\tvar red = new Color(255, 0, 0);\n\t\tactivityIndicator.Color = red;\n\t\tAssert.Equal(red, activityIndicator.Color);\n\n\t\tvar blue = new Color(0, 0, 255);\n\t\tactivityIndicator.Color = blue;\n\t\tAssert.Equal(blue, activityIndicator.Color);\n\n\t\tactivityIndicator.Color = null;\n\t\tAssert.Null(activityIndicator.Color);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedEventsWork()\n\t{\n\t\tstring? propertyName = null;\n\t\tvar activityIndicator = new ActivityIndicator();\n\t\tactivityIndicator.PropertyChanged += (sender, e) => propertyName = e.PropertyName;\n\n\t\tactivityIndicator.IsRunning = true;\n\t\tAssert.Equal(nameof(activityIndicator.IsRunning), propertyName);\n\n\t\tactivityIndicator.Color = new Color(0, 128, 0);\n\t\tAssert.Equal(nameof(activityIndicator.Color), propertyName);\n\t}\n\n\t[Fact]\n\tpublic void ActivityIndicatorInStackLayout()\n\t{\n\t\tvar blue = new Color(0, 0, 255);\n\t\tvar stackLayout = new StackLayout();\n\t\tvar activityIndicator = new ActivityIndicator\n\t\t{\n\t\t\tIsRunning = true,\n\t\t\tColor = blue\n\t\t};\n\n\t\tstackLayout.Add(activityIndicator);\n\t\tAssert.Single(stackLayout.Children);\n\t\tAssert.Same(activityIndicator, stackLayout.Children[0]);\n\t\tAssert.True(activityIndicator.IsRunning);\n\t\tAssert.Equal(blue, activityIndicator.Color);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/ApplicationTests.cs",
    "content": "﻿namespace Spice.Tests;\n\n/// <summary>\n/// Asserts the end-to-end idea works\n/// </summary>\npublic class ApplicationTests\n{\n\tclass App : Application\n\t{\n\t\tpublic App()\n\t\t{\n\t\t\tint count = 0;\n\n\t\t\tvar label = new Label\n\t\t\t{\n\t\t\t\tText = \"Hello, Spice 🌶\",\n\t\t\t};\n\n\t\t\tvar button = new Button\n\t\t\t{\n\t\t\t\tText = \"Click Me\",\n\t\t\t\tClicked = _ => label.Text = $\"Times: {++count}\"\n\t\t\t};\n\n\t\t\tMain = new StackLayout { label, button };\n\t\t}\n\t}\n\n\t[Fact]\n\tpublic void Application()\n\t{\n\t\tvar app = new App();\n\t\tAssert.NotNull(app.Main);\n\t\tAssert.Equal(2, app.Main.Children.Count);\n\n\t\tvar label = app.Main.Children[0] as Label;\n\t\tAssert.NotNull(label);\n\t\tvar button = app.Main.Children[1] as Button;\n\t\tAssert.NotNull(button);\n\t\tAssert.NotNull(button.Clicked);\n\n\t\tbutton.Clicked(button);\n\t\tAssert.Equal(\"Times: 1\", label.Text);\n\n\t\tbutton.Clicked(button);\n\t\tAssert.Equal(\"Times: 2\", label.Text);\n\t}\n}"
  },
  {
    "path": "tests/Spice.Tests/AutomationIdTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for AutomationId property on View\n/// </summary>\npublic class AutomationIdTests\n{\n\t[Fact]\n\tpublic void AutomationIdDefaultsToNull()\n\t{\n\t\tvar view = new View();\n\t\tAssert.Null(view.AutomationId);\n\t}\n\n\t[Fact]\n\tpublic void AutomationIdCanBeSet()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tAutomationId = \"test-view\"\n\t\t};\n\t\tAssert.Equal(\"test-view\", view.AutomationId);\n\t}\n\n\t[Fact]\n\tpublic void AutomationIdPropertyChangedEventFires()\n\t{\n\t\tstring? propertyName = null;\n\t\tvar view = new View();\n\t\tview.PropertyChanged += (sender, e) => propertyName = e.PropertyName;\n\n\t\tview.AutomationId = \"my-automation-id\";\n\t\tAssert.Equal(nameof(view.AutomationId), propertyName);\n\t\tAssert.Equal(\"my-automation-id\", view.AutomationId);\n\t}\n\n\t[Fact]\n\tpublic void AutomationIdWorksOnButton()\n\t{\n\t\tvar button = new Button\n\t\t{\n\t\t\tText = \"Click me\",\n\t\t\tAutomationId = \"button-test\"\n\t\t};\n\t\tAssert.Equal(\"button-test\", button.AutomationId);\n\t\tAssert.Equal(\"Click me\", button.Text);\n\t}\n\n\t[Fact]\n\tpublic void AutomationIdWorksOnLabel()\n\t{\n\t\tvar label = new Label\n\t\t{\n\t\t\tText = \"Hello\",\n\t\t\tAutomationId = \"label-test\"\n\t\t};\n\t\tAssert.Equal(\"label-test\", label.AutomationId);\n\t\tAssert.Equal(\"Hello\", label.Text);\n\t}\n\n\t[Fact]\n\tpublic void AutomationIdWorksOnEntry()\n\t{\n\t\tvar entry = new Entry\n\t\t{\n\t\t\tText = \"Input\",\n\t\t\tAutomationId = \"entry-test\"\n\t\t};\n\t\tAssert.Equal(\"entry-test\", entry.AutomationId);\n\t\tAssert.Equal(\"Input\", entry.Text);\n\t}\n\n\t[Fact]\n\tpublic void AutomationIdWorksOnActivityIndicator()\n\t{\n\t\tvar activityIndicator = new ActivityIndicator\n\t\t{\n\t\t\tIsRunning = true,\n\t\t\tAutomationId = \"spinner-test\"\n\t\t};\n\t\tAssert.Equal(\"spinner-test\", activityIndicator.AutomationId);\n\t\tAssert.True(activityIndicator.IsRunning);\n\t}\n\n\t[Fact]\n\tpublic void CanChangeAutomationId()\n\t{\n\t\tvar view = new View { AutomationId = \"old-id\" };\n\t\tAssert.Equal(\"old-id\", view.AutomationId);\n\n\t\tview.AutomationId = \"new-id\";\n\t\tAssert.Equal(\"new-id\", view.AutomationId);\n\n\t\tview.AutomationId = null;\n\t\tAssert.Null(view.AutomationId);\n\t}\n\n\t[Fact]\n\tpublic void AutomationIdWorksInStackLayout()\n\t{\n\t\tvar stackView = new StackLayout();\n\t\tvar button = new Button\n\t\t{\n\t\t\tText = \"Test\",\n\t\t\tAutomationId = \"stack-button\"\n\t\t};\n\n\t\tstackView.Add(button);\n\t\tAssert.Single(stackView.Children);\n\t\tAssert.Same(button, stackView.Children[0]);\n\t\tAssert.Equal(\"stack-button\", button.AutomationId);\n\t}\n\n\t[Fact]\n\tpublic void AutomationIdCanBeSetAfterCreation()\n\t{\n\t\tvar view = new View();\n\t\tAssert.Null(view.AutomationId);\n\n\t\tview.AutomationId = \"late-id\";\n\t\tAssert.Equal(\"late-id\", view.AutomationId);\n\t}\n\n\t[Fact]\n\tpublic void AutomationIdWorksWithMultipleViews()\n\t{\n\t\tvar view1 = new View { AutomationId = \"view1\" };\n\t\tvar view2 = new View { AutomationId = \"view2\" };\n\t\tvar view3 = new View { AutomationId = \"view3\" };\n\n\t\tAssert.Equal(\"view1\", view1.AutomationId);\n\t\tAssert.Equal(\"view2\", view2.AutomationId);\n\t\tAssert.Equal(\"view3\", view3.AutomationId);\n\t}\n\n\t[Fact]\n\tpublic void AutomationIdWorksOnImage()\n\t{\n\t\tvar image = new Image\n\t\t{\n\t\t\tAutomationId = \"image-test\"\n\t\t};\n\t\tAssert.Equal(\"image-test\", image.AutomationId);\n\t}\n\n\t[Fact]\n\tpublic void AutomationIdWorksOnImageButton()\n\t{\n\t\tvar imageButton = new ImageButton\n\t\t{\n\t\t\tAutomationId = \"image-button-test\"\n\t\t};\n\t\tAssert.Equal(\"image-button-test\", imageButton.AutomationId);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/BindingExtensionsTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for the Bind() extension method and one-way data-binding functionality.\n/// </summary>\npublic class BindingExtensionsTests\n{\n\t[Fact]\n\tpublic void Bind_SyncsInitialValue()\n\t{\n\t\t// Arrange\n\t\tvar label = new Label { Text = \"Initial\" };\n\t\tvar viewModel = new TestViewModel { Title = \"Hello\" };\n\n\t\t// Act\n\t\tviewModel.Bind(nameof(viewModel.Title), vm => vm.Title, text => label.Text = text);\n\n\t\t// Assert\n\t\tAssert.Equal(\"Hello\", label.Text);\n\t}\n\n\t[Fact]\n\tpublic void Bind_UpdatesWhenPropertyChanges()\n\t{\n\t\t// Arrange\n\t\tvar label = new Label();\n\t\tvar viewModel = new TestViewModel { Title = \"Initial\" };\n\t\tviewModel.Bind(nameof(viewModel.Title), vm => vm.Title, text => label.Text = text);\n\n\t\t// Act\n\t\tviewModel.Title = \"Updated\";\n\n\t\t// Assert\n\t\tAssert.Equal(\"Updated\", label.Text);\n\t}\n\n\t[Fact]\n\tpublic void Bind_DoesNotUpdateForOtherProperties()\n\t{\n\t\t// Arrange\n\t\tvar label = new Label();\n\t\tvar viewModel = new TestViewModel { Title = \"Initial\", Count = 0 };\n\t\tviewModel.Bind(nameof(viewModel.Title), vm => vm.Title, text => label.Text = text);\n\n\t\t// Act\n\t\tviewModel.Count = 42; // Change a different property\n\n\t\t// Assert\n\t\tAssert.Equal(\"Initial\", label.Text); // Should not have changed\n\t}\n\n\t[Fact]\n\tpublic void Bind_SupportsMultipleBindings()\n\t{\n\t\t// Arrange\n\t\tvar titleLabel = new Label();\n\t\tvar countLabel = new Label();\n\t\tvar viewModel = new TestViewModel { Title = \"Test\", Count = 5 };\n\n\t\t// Act\n\t\tviewModel.Bind(nameof(viewModel.Title), vm => vm.Title, text => titleLabel.Text = text);\n\t\tviewModel.Bind(nameof(viewModel.Count), vm => vm.Count, n => countLabel.Text = $\"Count: {n}\");\n\n\t\t// Assert\n\t\tAssert.Equal(\"Test\", titleLabel.Text);\n\t\tAssert.Equal(\"Count: 5\", countLabel.Text);\n\n\t\t// Update both\n\t\tviewModel.Title = \"Updated\";\n\t\tviewModel.Count = 10;\n\n\t\tAssert.Equal(\"Updated\", titleLabel.Text);\n\t\tAssert.Equal(\"Count: 10\", countLabel.Text);\n\t}\n\n\t[Fact]\n\tpublic void Bind_DisposalStopsUpdates()\n\t{\n\t\t// Arrange\n\t\tvar label = new Label();\n\t\tvar viewModel = new TestViewModel { Title = \"Initial\" };\n\t\tvar binding = viewModel.Bind(nameof(viewModel.Title), vm => vm.Title, text => label.Text = text);\n\n\t\t// Act\n\t\tbinding.Dispose();\n\t\tviewModel.Title = \"After Dispose\";\n\n\t\t// Assert\n\t\tAssert.Equal(\"Initial\", label.Text); // Should not update after disposal\n\t}\n\n\t[Fact]\n\tpublic void Bind_MultipleDisposalsSafe()\n\t{\n\t\t// Arrange\n\t\tvar label = new Label();\n\t\tvar viewModel = new TestViewModel { Title = \"Test\" };\n\t\tvar binding = viewModel.Bind(nameof(viewModel.Title), vm => vm.Title, text => label.Text = text);\n\n\t\t// Act & Assert - should not throw\n\t\tbinding.Dispose();\n\t\tbinding.Dispose();\n\t\tbinding.Dispose();\n\t}\n\n\t[Fact]\n\tpublic void Bind_ThrowsOnNullSource()\n\t{\n\t\t// Arrange\n\t\tTestViewModel? source = null;\n\t\tvar label = new Label();\n\n\t\t// Act & Assert\n\t\tAssert.Throws<ArgumentNullException>(() =>\n\t\t\tsource!.Bind(nameof(TestViewModel.Title), vm => vm.Title, text => label.Text = text));\n\t}\n\n\t[Fact]\n\tpublic void Bind_ThrowsOnNullPropertyName()\n\t{\n\t\t// Arrange\n\t\tvar viewModel = new TestViewModel();\n\t\tvar label = new Label();\n\n\t\t// Act & Assert\n\t\tAssert.Throws<ArgumentNullException>(() =>\n\t\t\tviewModel.Bind(null!, vm => vm.Title, text => label.Text = text));\n\t}\n\n\t[Fact]\n\tpublic void Bind_ThrowsOnNullGetter()\n\t{\n\t\t// Arrange\n\t\tvar viewModel = new TestViewModel();\n\t\tvar label = new Label();\n\n\t\t// Act & Assert\n\t\tAssert.Throws<ArgumentNullException>(() =>\n\t\t\tviewModel.Bind(nameof(viewModel.Title), (Func<TestViewModel, string>)null!, text => label.Text = text));\n\t}\n\n\t[Fact]\n\tpublic void Bind_ThrowsOnNullApply()\n\t{\n\t\t// Arrange\n\t\tvar viewModel = new TestViewModel();\n\n\t\t// Act & Assert\n\t\tAssert.Throws<ArgumentNullException>(() =>\n\t\t\tviewModel.Bind(nameof(viewModel.Title), vm => vm.Title, null!));\n\t}\n\n\t[Fact]\n\tpublic void Bind_WorksWithViewToView()\n\t{\n\t\t// Arrange\n\t\tvar sourceLabel = new Label { Text = \"Source\" };\n\t\tvar targetLabel = new Label();\n\n\t\t// Act\n\t\tsourceLabel.Bind(nameof(sourceLabel.Text), l => l.Text, text => targetLabel.Text = text);\n\n\t\t// Assert\n\t\tAssert.Equal(\"Source\", targetLabel.Text);\n\n\t\t// Update\n\t\tsourceLabel.Text = \"Changed\";\n\t\tAssert.Equal(\"Changed\", targetLabel.Text);\n\t}\n\n\t[Fact]\n\tpublic void Bind_WorksWithValueTypes()\n\t{\n\t\t// Arrange\n\t\tvar viewModel = new TestViewModel { Count = 42 };\n\t\tint capturedValue = 0;\n\n\t\t// Act\n\t\tviewModel.Bind(nameof(viewModel.Count), vm => vm.Count, n => capturedValue = n);\n\n\t\t// Assert\n\t\tAssert.Equal(42, capturedValue);\n\n\t\t// Update\n\t\tviewModel.Count = 100;\n\t\tAssert.Equal(100, capturedValue);\n\t}\n\n\t[Fact]\n\tpublic void Bind_WorksWithBooleans()\n\t{\n\t\t// Arrange\n\t\tvar viewModel = new TestViewModel { IsEnabled = true };\n\t\tvar view = new View();\n\n\t\t// Act\n\t\tviewModel.Bind(nameof(viewModel.IsEnabled), vm => vm.IsEnabled, enabled => view.IsEnabled = enabled);\n\n\t\t// Assert\n\t\tAssert.True(view.IsEnabled);\n\n\t\t// Update\n\t\tviewModel.IsEnabled = false;\n\t\tAssert.False(view.IsEnabled);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/BorderTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for Border control\n/// </summary>\npublic class BorderTests\n{\n\t[Fact]\n\tpublic void Constructor()\n\t{\n\t\tvar border = new Border();\n\t\tAssert.NotNull(border);\n\t}\n\n\t[Fact]\n\tpublic void DefaultProperties()\n\t{\n\t\tvar border = new Border();\n\t\tAssert.Null(border.Content);\n\t\tAssert.Null(border.Stroke);\n\t\tAssert.Equal(1.0, border.StrokeThickness);\n\t\tAssert.Equal(0.0, border.CornerRadius);\n\t\tAssert.Equal(0.0, border.Padding);\n\t}\n\n\t[Fact]\n\tpublic void SetContent()\n\t{\n\t\tvar border = new Border();\n\t\tvar label = new Label { Text = \"Test\" };\n\t\tborder.Content = label;\n\t\tAssert.Equal(label, border.Content);\n\t}\n\n\t[Fact]\n\tpublic void SetStroke()\n\t{\n\t\tvar border = new Border\n\t\t{\n\t\t\tStroke = Colors.Red\n\t\t};\n\t\tAssert.Equal(Colors.Red, border.Stroke);\n\t}\n\n\t[Fact]\n\tpublic void SetStrokeThickness()\n\t{\n\t\tvar border = new Border\n\t\t{\n\t\t\tStrokeThickness = 2.5\n\t\t};\n\t\tAssert.Equal(2.5, border.StrokeThickness);\n\t}\n\n\t[Fact]\n\tpublic void SetCornerRadius()\n\t{\n\t\tvar border = new Border\n\t\t{\n\t\t\tCornerRadius = 10.0\n\t\t};\n\t\tAssert.Equal(10.0, border.CornerRadius);\n\t}\n\n\t[Fact]\n\tpublic void SetPadding()\n\t{\n\t\tvar border = new Border\n\t\t{\n\t\t\tPadding = 8.0\n\t\t};\n\t\tAssert.Equal(8.0, border.Padding);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFires()\n\t{\n\t\tstring? property = null;\n\t\tvar border = new Border();\n\t\tborder.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\tborder.StrokeThickness = 3.0;\n\n\t\tAssert.Equal(nameof(border.StrokeThickness), property);\n\t}\n\n\t[Fact]\n\tpublic void CanSetAllProperties()\n\t{\n\t\tvar label = new Label { Text = \"Content\" };\n\t\tvar border = new Border\n\t\t{\n\t\t\tContent = label,\n\t\t\tStroke = Colors.Blue,\n\t\t\tStrokeThickness = 2.0,\n\t\t\tCornerRadius = 15.0,\n\t\t\tPadding = 10.0,\n\t\t\tBackgroundColor = Colors.LightGray\n\t\t};\n\n\t\tAssert.Equal(label, border.Content);\n\t\tAssert.Equal(Colors.Blue, border.Stroke);\n\t\tAssert.Equal(2.0, border.StrokeThickness);\n\t\tAssert.Equal(15.0, border.CornerRadius);\n\t\tAssert.Equal(10.0, border.Padding);\n\t\tAssert.Equal(Colors.LightGray, border.BackgroundColor);\n\t}\n\n\t[Fact]\n\tpublic void ContentCanBeChanged()\n\t{\n\t\tvar border = new Border();\n\t\tvar label1 = new Label { Text = \"First\" };\n\t\tvar label2 = new Label { Text = \"Second\" };\n\n\t\tborder.Content = label1;\n\t\tAssert.Equal(label1, border.Content);\n\n\t\tborder.Content = label2;\n\t\tAssert.Equal(label2, border.Content);\n\t}\n\n\t[Fact]\n\tpublic void ContentCanBeCleared()\n\t{\n\t\tvar border = new Border();\n\t\tvar label = new Label { Text = \"Test\" };\n\n\t\tborder.Content = label;\n\t\tAssert.NotNull(border.Content);\n\n\t\tborder.Content = null;\n\t\tAssert.Null(border.Content);\n\t}\n\n\t[Fact]\n\tpublic void AddingToChildrenDoesNotSetContent()\n\t{\n\t\tvar border = new Border();\n\t\tvar label1 = new Label { Text = \"Label 1\" };\n\t\tvar label2 = new Label { Text = \"Label 2\" };\n\n\t\t// Border should only support Content, not Children collection\n\t\t// Children can be added to the collection but they won't be rendered\n\t\tborder.Children.Add(label1);\n\t\tborder.Children.Add(label2);\n\n\t\t// Children collection is modified but Content remains null\n\t\tAssert.Equal(2, border.Children.Count);\n\t\tAssert.Null(border.Content);\n\t}\n\n\t[Fact]\n\tpublic void BackgroundColorCanBeSet()\n\t{\n\t\tvar border = new Border\n\t\t{\n\t\t\tBackgroundColor = Colors.Blue\n\t\t};\n\t\tAssert.Equal(Colors.Blue, border.BackgroundColor);\n\t}\n\n\t[Fact]\n\tpublic void BackgroundColorCanBeChanged()\n\t{\n\t\tvar border = new Border\n\t\t{\n\t\t\tBackgroundColor = Colors.Blue\n\t\t};\n\t\tAssert.Equal(Colors.Blue, border.BackgroundColor);\n\n\t\tborder.BackgroundColor = Colors.Red;\n\t\tAssert.Equal(Colors.Red, border.BackgroundColor);\n\n\t\tborder.BackgroundColor = null;\n\t\tAssert.Null(border.BackgroundColor);\n\t}\n\n\t[Fact]\n\tpublic void StrokeThicknessCanBeSetWhenStrokeIsNull()\n\t{\n\t\tvar border = new Border\n\t\t{\n\t\t\tStroke = null,\n\t\t\tStrokeThickness = 5.0\n\t\t};\n\t\tAssert.Null(border.Stroke);\n\t\tAssert.Equal(5.0, border.StrokeThickness);\n\n\t\t// Setting Stroke after StrokeThickness should use the correct thickness\n\t\tborder.Stroke = Colors.Red;\n\t\tAssert.Equal(Colors.Red, border.Stroke);\n\t\tAssert.Equal(5.0, border.StrokeThickness);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/BoxViewTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for BoxView control\n/// </summary>\npublic class BoxViewTests\n{\n\t[Fact]\n\tpublic void BoxViewCreation()\n\t{\n\t\tvar boxView = new BoxView();\n\t\tAssert.NotNull(boxView);\n\t\tAssert.Null(boxView.Color);\n\t}\n\n\t[Fact]\n\tpublic void ColorProperty()\n\t{\n\t\tvar boxView = new BoxView();\n\t\tAssert.Null(boxView.Color);\n\n\t\tvar red = new Color(255, 0, 0);\n\t\tboxView.Color = red;\n\t\tAssert.Equal(red, boxView.Color);\n\n\t\tvar blue = new Color(0, 0, 255);\n\t\tboxView.Color = blue;\n\t\tAssert.Equal(blue, boxView.Color);\n\n\t\tboxView.Color = null;\n\t\tAssert.Null(boxView.Color);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedEventsWork()\n\t{\n\t\tstring? propertyName = null;\n\t\tvar boxView = new BoxView();\n\t\tboxView.PropertyChanged += (sender, e) => propertyName = e.PropertyName;\n\n\t\tboxView.Color = new Color(0, 128, 0);\n\t\tAssert.Equal(nameof(boxView.Color), propertyName);\n\t}\n\n\t[Fact]\n\tpublic void BoxViewInStackLayout()\n\t{\n\t\tvar green = new Color(0, 255, 0);\n\t\tvar stackLayout = new StackLayout();\n\t\tvar boxView = new BoxView\n\t\t{\n\t\t\tColor = green\n\t\t};\n\n\t\tstackLayout.Add(boxView);\n\t\tAssert.Single(stackLayout.Children);\n\t\tAssert.Same(boxView, stackLayout.Children[0]);\n\t\tAssert.Equal(green, boxView.Color);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/ButtonTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Contains unit tests verifying the behavior of the Button view.\n/// </summary>\n\npublic class ButtonTests\n{\n\t[Fact]\n\tpublic void ButtonCanBeCreated()\n\t{\n\t\tvar button = new Button();\n\t\tAssert.NotNull(button);\n\t}\n\n\t[Fact]\n\tpublic void ButtonInheritsFromView()\n\t{\n\t\tvar button = new Button();\n\t\tAssert.IsAssignableFrom<View>(button);\n\t}\n\n\t[Fact]\n\tpublic void TextPropertyDefaultsToEmptyString()\n\t{\n\t\tvar button = new Button();\n\t\tAssert.Equal(\"\", button.Text);\n\t}\n\n\t[Fact]\n\tpublic void TextPropertyCanBeSet()\n\t{\n\t\tvar button = new Button { Text = \"Click Me\" };\n\t\tAssert.Equal(\"Click Me\", button.Text);\n\t}\n\n\t[Fact]\n\tpublic void TextColorPropertyDefaultsToNull()\n\t{\n\t\tvar button = new Button();\n\t\tAssert.Null(button.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void TextColorPropertyCanBeSet()\n\t{\n\t\tvar color = Colors.Blue;\n\t\tvar button = new Button { TextColor = color };\n\t\tAssert.Equal(color, button.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void ClickedActionDefaultsToNull()\n\t{\n\t\tvar button = new Button();\n\t\tAssert.Null(button.Clicked);\n\t}\n\n\t[Fact]\n\tpublic void ClickedActionCanBeSet()\n\t{\n\t\tvar actionCalled = false;\n\t\tvar button = new Button\n\t\t{\n\t\t\tClicked = _ => actionCalled = true\n\t\t};\n\t\t\n\t\tAssert.NotNull(button.Clicked);\n\t\tbutton.Clicked?.Invoke(button);\n\t\tAssert.True(actionCalled);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnTextChange()\n\t{\n\t\tvar button = new Button();\n\t\tvar propertyChangedFired = false;\n\t\tbutton.PropertyChanged += (s, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(Button.Text))\n\t\t\t\tpropertyChangedFired = true;\n\t\t};\n\n\t\tbutton.Text = \"New Text\";\n\t\tAssert.True(propertyChangedFired);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnTextColorChange()\n\t{\n\t\tvar button = new Button();\n\t\tvar propertyChangedFired = false;\n\t\tbutton.PropertyChanged += (s, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(Button.TextColor))\n\t\t\t\tpropertyChangedFired = true;\n\t\t};\n\n\t\tbutton.TextColor = Colors.Red;\n\t\tAssert.True(propertyChangedFired);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnClickedChange()\n\t{\n\t\tvar button = new Button();\n\t\tvar propertyChangedFired = false;\n\t\tbutton.PropertyChanged += (s, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(Button.Clicked))\n\t\t\t\tpropertyChangedFired = true;\n\t\t};\n\n\t\tbutton.Clicked = _ => { };\n\t\tAssert.True(propertyChangedFired);\n\t}\n\n\t[Fact]\n\tpublic void ClickedCanBeReplacedWithoutStaleHandler()\n\t{\n\t\tvar button = new Button();\n\t\tint callCount1 = 0;\n\t\tint callCount2 = 0;\n\n\t\t// Set first handler\n\t\tbutton.Clicked = _ => callCount1++;\n\n\t\t// Replace with second handler\n\t\tbutton.Clicked = _ => callCount2++;\n\n\t\t// Only the second handler should be the current Clicked value\n\t\tbutton.Clicked?.Invoke(button);\n\t\tAssert.Equal(0, callCount1);\n\t\tAssert.Equal(1, callCount2);\n\t}\n\n\t[Fact]\n\tpublic void ClickedCanBeSetToNullAfterNonNull()\n\t{\n\t\tvar button = new Button();\n\t\tbutton.Clicked = _ => { };\n\t\tAssert.NotNull(button.Clicked);\n\n\t\tbutton.Clicked = null;\n\t\tAssert.Null(button.Clicked);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/CheckBoxTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for CheckBox control\n/// </summary>\npublic class CheckBoxTests\n{\n\t[Fact]\n\tpublic void IsCheckedPropertyChanged()\n\t{\n\t\tstring? property = null;\n\t\tvar checkBox = new CheckBox();\n\t\tcheckBox.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\tcheckBox.IsChecked = true;\n\n\t\tAssert.Equal(nameof(checkBox.IsChecked), property);\n\t\tAssert.True(checkBox.IsChecked);\n\t}\n\n\t[Fact]\n\tpublic void CheckedChangedAssignmentRaisesPropertyChanged()\n\t{\n\t\tstring? property = null;\n\t\tvar checkBox = new CheckBox();\n\t\tcheckBox.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\tcheckBox.CheckedChanged = _ => { };\n\n\t\tAssert.Equal(nameof(checkBox.CheckedChanged), property);\n\t\tAssert.NotNull(checkBox.CheckedChanged);\n\t}\n\n\t[Fact]\n\tpublic void DefaultIsCheckedIsFalse()\n\t{\n\t\tvar checkBox = new CheckBox();\n\t\tAssert.False(checkBox.IsChecked);\n\t}\n\n\t[Fact]\n\tpublic void IsCheckedCanBeSet()\n\t{\n\t\tvar checkBox = new CheckBox { IsChecked = true };\n\t\tAssert.True(checkBox.IsChecked);\n\n\t\tcheckBox.IsChecked = false;\n\t\tAssert.False(checkBox.IsChecked);\n\t}\n\n\t[Fact]\n\tpublic void CheckedChangedCanBeSet()\n\t{\n\t\tbool invoked = false;\n\t\tvar checkBox = new CheckBox { CheckedChanged = _ => invoked = true };\n\t\t\n\t\tAssert.NotNull(checkBox.CheckedChanged);\n\t\tcheckBox.CheckedChanged?.Invoke(checkBox);\n\t\tAssert.True(invoked);\n\t}\n}\n\n"
  },
  {
    "path": "tests/Spice.Tests/CollectionViewTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for CollectionView functionality\n/// </summary>\npublic class CollectionViewTests\n{\n\t[Fact]\n\tpublic void CanCreate()\n\t{\n\t\tvar collectionView = new CollectionView();\n\t\tAssert.NotNull(collectionView);\n\t}\n\n\t[Fact]\n\tpublic void DefaultOrientationIsVertical()\n\t{\n\t\tvar collectionView = new CollectionView();\n\t\tAssert.Equal(Orientation.Vertical, collectionView.Orientation);\n\t}\n\n\t[Fact]\n\tpublic void DefaultSelectionModeIsNone()\n\t{\n\t\tvar collectionView = new CollectionView();\n\t\tAssert.Equal(SelectionMode.None, collectionView.SelectionMode);\n\t}\n\n\t[Fact]\n\tpublic void DefaultItemSpacingIsZero()\n\t{\n\t\tvar collectionView = new CollectionView();\n\t\tAssert.Equal(0, collectionView.ItemSpacing);\n\t}\n\n\t[Fact]\n\tpublic void ItemsSourceIsNullByDefault()\n\t{\n\t\tvar collectionView = new CollectionView();\n\t\tAssert.Null(collectionView.ItemsSource);\n\t}\n\n\t[Fact]\n\tpublic void ItemTemplateIsNullByDefault()\n\t{\n\t\tvar collectionView = new CollectionView();\n\t\tAssert.Null(collectionView.ItemTemplate);\n\t}\n\n\t[Fact]\n\tpublic void SelectedItemIsNullByDefault()\n\t{\n\t\tvar collectionView = new CollectionView();\n\t\tAssert.Null(collectionView.SelectedItem);\n\t}\n\n\t[Fact]\n\tpublic void CanSetItemsSource()\n\t{\n\t\tvar collectionView = new CollectionView();\n\t\tvar items = new List<string> { \"Item 1\", \"Item 2\", \"Item 3\" };\n\t\t\n\t\tcollectionView.ItemsSource = items;\n\t\t\n\t\tAssert.NotNull(collectionView.ItemsSource);\n\t\tAssert.Equal(items, collectionView.ItemsSource);\n\t}\n\n\t[Fact]\n\tpublic void CanSetItemTemplate()\n\t{\n\t\tvar collectionView = new CollectionView();\n\t\tFunc<object, View> template = item => new Label { Text = item.ToString()! };\n\t\t\n\t\tcollectionView.ItemTemplate = template;\n\t\t\n\t\tAssert.NotNull(collectionView.ItemTemplate);\n\t\tAssert.Equal(template, collectionView.ItemTemplate);\n\t}\n\n\t[Fact]\n\tpublic void CanSetOrientation()\n\t{\n\t\tvar collectionView = new CollectionView\n\t\t{\n\t\t\tOrientation = Orientation.Horizontal\n\t\t};\n\t\tAssert.Equal(Orientation.Horizontal, collectionView.Orientation);\n\t}\n\n\t[Fact]\n\tpublic void CanSetSelectionMode()\n\t{\n\t\tvar collectionView = new CollectionView\n\t\t{\n\t\t\tSelectionMode = SelectionMode.Single\n\t\t};\n\t\tAssert.Equal(SelectionMode.Single, collectionView.SelectionMode);\n\t}\n\n\t[Fact]\n\tpublic void CanSetItemSpacing()\n\t{\n\t\tvar collectionView = new CollectionView\n\t\t{\n\t\t\tItemSpacing = 10\n\t\t};\n\t\tAssert.Equal(10, collectionView.ItemSpacing);\n\t}\n\n\t[Fact]\n\tpublic void CanSetSelectedItem()\n\t{\n\t\tvar collectionView = new CollectionView\n\t\t{\n\t\t\tSelectionMode = SelectionMode.Single\n\t\t};\n\t\tvar item = \"Selected Item\";\n\t\t\n\t\tcollectionView.SelectedItem = item;\n\t\t\n\t\tAssert.Equal(item, collectionView.SelectedItem);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnItemsSourceChange()\n\t{\n\t\tstring? property = null;\n\t\tvar collectionView = new CollectionView();\n\t\tcollectionView.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\t\n\t\tcollectionView.ItemsSource = new List<string> { \"Item\" };\n\n\t\tAssert.Equal(nameof(collectionView.ItemsSource), property);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnItemTemplateChange()\n\t{\n\t\tstring? property = null;\n\t\tvar collectionView = new CollectionView();\n\t\tcollectionView.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\t\n\t\tcollectionView.ItemTemplate = item => new Label { Text = item.ToString()! };\n\n\t\tAssert.Equal(nameof(collectionView.ItemTemplate), property);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnOrientationChange()\n\t{\n\t\tstring? property = null;\n\t\tvar collectionView = new CollectionView();\n\t\tcollectionView.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\t\n\t\tcollectionView.Orientation = Orientation.Horizontal;\n\n\t\tAssert.Equal(nameof(collectionView.Orientation), property);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnSelectionModeChange()\n\t{\n\t\tstring? property = null;\n\t\tvar collectionView = new CollectionView();\n\t\tcollectionView.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\t\n\t\tcollectionView.SelectionMode = SelectionMode.Single;\n\n\t\tAssert.Equal(nameof(collectionView.SelectionMode), property);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnSelectedItemChange()\n\t{\n\t\tstring? property = null;\n\t\tvar collectionView = new CollectionView();\n\t\tcollectionView.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\t\n\t\tcollectionView.SelectedItem = \"Item\";\n\n\t\tAssert.Equal(nameof(collectionView.SelectedItem), property);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnItemSpacingChange()\n\t{\n\t\tstring? property = null;\n\t\tvar collectionView = new CollectionView();\n\t\tcollectionView.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\t\n\t\tcollectionView.ItemSpacing = 5;\n\n\t\tAssert.Equal(nameof(collectionView.ItemSpacing), property);\n\t}\n\n\t[Fact]\n\tpublic void ItemTemplateCreatesViewForItem()\n\t{\n\t\tvar collectionView = new CollectionView\n\t\t{\n\t\t\tItemTemplate = item => new Label { Text = item.ToString()! }\n\t\t};\n\n\t\tvar view = collectionView.ItemTemplate!(\"Test Item\");\n\t\t\n\t\tAssert.NotNull(view);\n\t\tAssert.IsType<Label>(view);\n\t\tAssert.Equal(\"Test Item\", ((Label)view).Text);\n\t}\n\n\t[Fact]\n\tpublic void ItemTemplateCanReturnDifferentViewTypes()\n\t{\n\t\tvar collectionView = new CollectionView\n\t\t{\n\t\t\tItemTemplate = item =>\n\t\t\t{\n\t\t\t\tif (item is string s && s.StartsWith(\"Button\"))\n\t\t\t\t\treturn new Button { Text = s };\n\t\t\t\telse\n\t\t\t\t\treturn new Label { Text = item.ToString()! };\n\t\t\t}\n\t\t};\n\n\t\tvar labelView = collectionView.ItemTemplate!(\"Label Item\");\n\t\tvar buttonView = collectionView.ItemTemplate!(\"Button Item\");\n\t\t\n\t\tAssert.IsType<Label>(labelView);\n\t\tAssert.IsType<Button>(buttonView);\n\t}\n\n\t[Fact]\n\tpublic void CanUseObservableCollectionAsItemsSource()\n\t{\n\t\tvar collectionView = new CollectionView();\n\t\tvar items = new System.Collections.ObjectModel.ObservableCollection<string>\n\t\t{\n\t\t\t\"Item 1\", \"Item 2\"\n\t\t};\n\t\t\n\t\tcollectionView.ItemsSource = items;\n\t\t\n\t\tAssert.NotNull(collectionView.ItemsSource);\n\t\tAssert.Equal(2, items.Count);\n\t}\n\n\t[Fact]\n\tpublic void CanReplaceItemsSource()\n\t{\n\t\tvar collectionView = new CollectionView();\n\t\tvar firstItems = new List<string> { \"Item 1\" };\n\t\tvar secondItems = new List<string> { \"Item A\", \"Item B\" };\n\n\t\tcollectionView.ItemsSource = firstItems;\n\t\tAssert.Equal(firstItems, collectionView.ItemsSource);\n\n\t\tcollectionView.ItemsSource = secondItems;\n\t\tAssert.Equal(secondItems, collectionView.ItemsSource);\n\t}\n\n\t[Fact]\n\tpublic void CanClearItemsSource()\n\t{\n\t\tvar collectionView = new CollectionView();\n\t\tvar items = new List<string> { \"Item 1\" };\n\t\t\n\t\tcollectionView.ItemsSource = items;\n\t\tAssert.NotNull(collectionView.ItemsSource);\n\n\t\tcollectionView.ItemsSource = null;\n\t\tAssert.Null(collectionView.ItemsSource);\n\t}\n\n\t[Fact]\n\tpublic void MultipleSelectionModeAllowsMultipleItems()\n\t{\n\t\tvar collectionView = new CollectionView\n\t\t{\n\t\t\tSelectionMode = SelectionMode.Multiple\n\t\t};\n\n\t\tAssert.Equal(SelectionMode.Multiple, collectionView.SelectionMode);\n\t}\n\n\t[Fact]\n\tpublic void CanCreateCompleteCollectionView()\n\t{\n\t\tvar items = new List<string> { \"Apple\", \"Banana\", \"Cherry\" };\n\t\tvar collectionView = new CollectionView\n\t\t{\n\t\t\tItemsSource = items,\n\t\t\tItemTemplate = item => new Label { Text = item.ToString()! },\n\t\t\tOrientation = Orientation.Vertical,\n\t\t\tSelectionMode = SelectionMode.Single,\n\t\t\tItemSpacing = 5\n\t\t};\n\n\t\tAssert.NotNull(collectionView.ItemsSource);\n\t\tAssert.NotNull(collectionView.ItemTemplate);\n\t\tAssert.Equal(Orientation.Vertical, collectionView.Orientation);\n\t\tAssert.Equal(SelectionMode.Single, collectionView.SelectionMode);\n\t\tAssert.Equal(5, collectionView.ItemSpacing);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/ContentViewTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for ContentView functionality\n/// </summary>\npublic class ContentViewTests\n{\n\t[Fact]\n\tpublic void CanCreate()\n\t{\n\t\tvar contentView = new ContentView();\n\t\tAssert.NotNull(contentView);\n\t}\n\n\t[Fact]\n\tpublic void ContentIsNullByDefault()\n\t{\n\t\tvar contentView = new ContentView();\n\t\tAssert.Null(contentView.Content);\n\t}\n\n\t[Fact]\n\tpublic void CanSetContent()\n\t{\n\t\tvar contentView = new ContentView();\n\t\tvar label = new Label { Text = \"Test\" };\n\t\t\n\t\tcontentView.Content = label;\n\t\t\n\t\tAssert.NotNull(contentView.Content);\n\t\tAssert.Equal(label, contentView.Content);\n\t}\n\n\t[Fact]\n\tpublic void CanReplaceContent()\n\t{\n\t\tvar contentView = new ContentView();\n\t\tvar firstLabel = new Label { Text = \"First\" };\n\t\tvar secondLabel = new Label { Text = \"Second\" };\n\n\t\tcontentView.Content = firstLabel;\n\t\tAssert.Equal(firstLabel, contentView.Content);\n\n\t\tcontentView.Content = secondLabel;\n\t\tAssert.Equal(secondLabel, contentView.Content);\n\t}\n\n\t[Fact]\n\tpublic void CanClearContent()\n\t{\n\t\tvar contentView = new ContentView();\n\t\tvar label = new Label { Text = \"Test\" };\n\t\t\n\t\tcontentView.Content = label;\n\t\tAssert.NotNull(contentView.Content);\n\n\t\tcontentView.Content = null;\n\t\tAssert.Null(contentView.Content);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnContentChange()\n\t{\n\t\tstring? property = null;\n\t\tvar contentView = new ContentView();\n\t\tcontentView.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\t\n\t\tvar label = new Label { Text = \"Test\" };\n\t\tcontentView.Content = label;\n\n\t\tAssert.Equal(nameof(contentView.Content), property);\n\t}\n\n\t[Fact]\n\tpublic void SettingSameContentDoesNotFirePropertyChanged()\n\t{\n\t\tvar contentView = new ContentView();\n\t\tvar label = new Label { Text = \"Test\" };\n\t\tcontentView.Content = label;\n\n\t\tint propertyChangedCount = 0;\n\t\tcontentView.PropertyChanged += (sender, e) => propertyChangedCount++;\n\n\t\tcontentView.Content = label;\n\t\tAssert.Equal(0, propertyChangedCount);\n\t}\n\n\t[Fact]\n\tpublic void CanContainStackLayout()\n\t{\n\t\tvar contentView = new ContentView();\n\t\tvar stackView = new StackLayout\n\t\t{\n\t\t\tnew Label { Text = \"Item 1\" },\n\t\t\tnew Label { Text = \"Item 2\" },\n\t\t\tnew Label { Text = \"Item 3\" }\n\t\t};\n\t\t\n\t\tcontentView.Content = stackView;\n\t\t\n\t\tAssert.NotNull(contentView.Content);\n\t\tAssert.Equal(stackView, contentView.Content);\n\t\tAssert.Equal(3, stackView.Children.Count);\n\t}\n\n\t[Fact]\n\tpublic void CanContainComplexLayout()\n\t{\n\t\tvar contentView = new ContentView();\n\t\tvar scrollView = new ScrollView();\n\t\tvar innerStack = new StackLayout\n\t\t{\n\t\t\tnew Label { Text = \"Header\" },\n\t\t\tnew Button { Text = \"Click Me\" },\n\t\t\tnew Entry { Text = \"Enter text\" }\n\t\t};\n\t\tscrollView.Add(innerStack);\n\t\t\n\t\tcontentView.Content = scrollView;\n\t\t\n\t\tAssert.Equal(scrollView, contentView.Content);\n\t\tAssert.Single(scrollView.Children);\n\t\tAssert.Equal(innerStack, scrollView.Children[0]);\n\t}\n\n\t[Fact]\n\tpublic void ContentViewCanBeNestedInOtherViews()\n\t{\n\t\tvar outerStack = new StackLayout();\n\t\tvar contentView = new ContentView\n\t\t{\n\t\t\tContent = new Label { Text = \"Inside ContentView\" }\n\t\t};\n\t\t\n\t\touterStack.Add(contentView);\n\t\t\n\t\tAssert.Single(outerStack.Children);\n\t\tAssert.Equal(contentView, outerStack.Children[0]);\n\t\tAssert.NotNull(contentView.Content);\n\t}\n\n\t[Fact]\n\tpublic void MultipleContentViewsCanExist()\n\t{\n\t\tvar contentView1 = new ContentView { Content = new Label { Text = \"First\" } };\n\t\tvar contentView2 = new ContentView { Content = new Label { Text = \"Second\" } };\n\t\tvar contentView3 = new ContentView { Content = new Label { Text = \"Third\" } };\n\n\t\tvar stackView = new StackLayout\n\t\t{\n\t\t\tcontentView1,\n\t\t\tcontentView2,\n\t\t\tcontentView3\n\t\t};\n\n\t\tAssert.Equal(3, stackView.Children.Count);\n\t\tAssert.NotNull(contentView1.Content);\n\t\tAssert.NotNull(contentView2.Content);\n\t\tAssert.NotNull(contentView3.Content);\n\t}\n\n\t[Fact]\n\tpublic void DefaultPaddingIsZero()\n\t{\n\t\tvar contentView = new ContentView();\n\t\tAssert.Equal(0.0, contentView.Padding);\n\t}\n\n\t[Fact]\n\tpublic void CanSetPadding()\n\t{\n\t\tvar contentView = new ContentView\n\t\t{\n\t\t\tPadding = 10.0\n\t\t};\n\t\tAssert.Equal(10.0, contentView.Padding);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnPaddingChange()\n\t{\n\t\tstring? property = null;\n\t\tvar contentView = new ContentView();\n\t\tcontentView.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\t\n\t\tcontentView.Padding = 15.0;\n\n\t\tAssert.Equal(nameof(contentView.Padding), property);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/DatePickerTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for DatePicker control\n/// </summary>\npublic class DatePickerTests\n{\n\t[Fact]\n\tpublic void DatePicker_DefaultDate_IsToday()\n\t{\n\t\tvar todayBefore = DateTime.Today;\n\t\tvar datePicker = new DatePicker();\n\t\tvar todayAfter = DateTime.Today;\n\n\t\tAssert.True(datePicker.Date == todayBefore || datePicker.Date == todayAfter);\n\t}\n\n\t[Fact]\n\tpublic void DatePicker_SetDate_UpdatesProperty()\n\t{\n\t\tvar datePicker = new DatePicker();\n\t\tvar newDate = new DateTime(2024, 12, 25);\n\t\tdatePicker.Date = newDate;\n\t\tAssert.Equal(newDate, datePicker.Date);\n\t}\n\n\t[Fact]\n\tpublic void DatePicker_SetMinimumDate_UpdatesProperty()\n\t{\n\t\tvar datePicker = new DatePicker();\n\t\tvar minDate = new DateTime(2020, 1, 1);\n\t\tdatePicker.MinimumDate = minDate;\n\t\tAssert.Equal(minDate, datePicker.MinimumDate);\n\t}\n\n\t[Fact]\n\tpublic void DatePicker_SetMaximumDate_UpdatesProperty()\n\t{\n\t\tvar datePicker = new DatePicker();\n\t\tvar maxDate = new DateTime(2030, 12, 31);\n\t\tdatePicker.MaximumDate = maxDate;\n\t\tAssert.Equal(maxDate, datePicker.MaximumDate);\n\t}\n\n\t[Fact]\n\tpublic void DatePicker_SetTextColor_UpdatesProperty()\n\t{\n\t\tvar datePicker = new DatePicker();\n\t\tvar color = Microsoft.Maui.Graphics.Colors.Red;\n\t\tdatePicker.TextColor = color;\n\t\tAssert.Equal(color, datePicker.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void DatePicker_PropertyChanged_Fires()\n\t{\n\t\tstring? propertyName = null;\n\t\tvar datePicker = new DatePicker();\n\t\tdatePicker.PropertyChanged += (sender, e) => propertyName = e.PropertyName;\n\t\t\n\t\tvar newDate = new DateTime(2025, 6, 15);\n\t\tdatePicker.Date = newDate;\n\n\t\tAssert.Equal(nameof(datePicker.Date), propertyName);\n\t}\n\n\t[Fact]\n\tpublic void DatePicker_MinMaxDates_CanBeNull()\n\t{\n\t\tvar datePicker = new DatePicker\n\t\t{\n\t\t\tMinimumDate = new DateTime(2020, 1, 1),\n\t\t\tMaximumDate = new DateTime(2030, 12, 31)\n\t\t};\n\n\t\tAssert.NotNull(datePicker.MinimumDate);\n\t\tAssert.NotNull(datePicker.MaximumDate);\n\n\t\tdatePicker.MinimumDate = null;\n\t\tdatePicker.MaximumDate = null;\n\n\t\tAssert.Null(datePicker.MinimumDate);\n\t\tAssert.Null(datePicker.MaximumDate);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/EditorTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for the Editor view's default values, property setters, and change notifications.\n/// </summary>\n\npublic class EditorTests\n{\n\t[Fact]\n\tpublic void EditorCanBeCreated()\n\t{\n\t\tvar editor = new Editor();\n\t\tAssert.NotNull(editor);\n\t}\n\n\t[Fact]\n\tpublic void EditorInheritsFromView()\n\t{\n\t\tvar editor = new Editor();\n\t\tAssert.IsAssignableFrom<View>(editor);\n\t}\n\n\t[Fact]\n\tpublic void TextPropertyDefaultsToEmptyString()\n\t{\n\t\tvar editor = new Editor();\n\t\tAssert.Equal(\"\", editor.Text);\n\t}\n\n\t[Fact]\n\tpublic void TextPropertyCanBeSet()\n\t{\n\t\tvar editor = new Editor { Text = \"Hello World\\nMulti-line text\" };\n\t\tAssert.Equal(\"Hello World\\nMulti-line text\", editor.Text);\n\t}\n\n\t[Fact]\n\tpublic void TextColorPropertyDefaultsToNull()\n\t{\n\t\tvar editor = new Editor();\n\t\tAssert.Null(editor.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void TextColorPropertyCanBeSet()\n\t{\n\t\tvar color = Colors.Green;\n\t\tvar editor = new Editor { TextColor = color };\n\t\tAssert.Equal(color, editor.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void PlaceholderPropertyDefaultsToNull()\n\t{\n\t\tvar editor = new Editor();\n\t\tAssert.Null(editor.Placeholder);\n\t}\n\n\t[Fact]\n\tpublic void PlaceholderPropertyCanBeSet()\n\t{\n\t\tvar editor = new Editor { Placeholder = \"Enter text here...\" };\n\t\tAssert.Equal(\"Enter text here...\", editor.Placeholder);\n\t}\n\n\t[Fact]\n\tpublic void PlaceholderColorPropertyDefaultsToNull()\n\t{\n\t\tvar editor = new Editor();\n\t\tAssert.Null(editor.PlaceholderColor);\n\t}\n\n\t[Fact]\n\tpublic void PlaceholderColorPropertyCanBeSet()\n\t{\n\t\tvar color = Colors.Gray;\n\t\tvar editor = new Editor { PlaceholderColor = color };\n\t\tAssert.Equal(color, editor.PlaceholderColor);\n\t}\n\n\t[Fact]\n\tpublic void AutoSizePropertyDefaultsToFalse()\n\t{\n\t\tvar editor = new Editor();\n\t\tAssert.False(editor.AutoSize);\n\t}\n\n\t[Fact]\n\tpublic void AutoSizePropertyCanBeSet()\n\t{\n\t\tvar editor = new Editor { AutoSize = true };\n\t\tAssert.True(editor.AutoSize);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnTextChange()\n\t{\n\t\tvar editor = new Editor();\n\t\tvar propertyChangedFired = false;\n\t\teditor.PropertyChanged += (s, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(Editor.Text))\n\t\t\t\tpropertyChangedFired = true;\n\t\t};\n\n\t\teditor.Text = \"New Text\";\n\t\tAssert.True(propertyChangedFired);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnTextColorChange()\n\t{\n\t\tvar editor = new Editor();\n\t\tvar propertyChangedFired = false;\n\t\teditor.PropertyChanged += (s, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(Editor.TextColor))\n\t\t\t\tpropertyChangedFired = true;\n\t\t};\n\n\t\teditor.TextColor = Colors.Purple;\n\t\tAssert.True(propertyChangedFired);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnPlaceholderChange()\n\t{\n\t\tvar editor = new Editor();\n\t\tvar propertyChangedFired = false;\n\t\teditor.PropertyChanged += (s, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(Editor.Placeholder))\n\t\t\t\tpropertyChangedFired = true;\n\t\t};\n\n\t\teditor.Placeholder = \"New placeholder\";\n\t\tAssert.True(propertyChangedFired);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnPlaceholderColorChange()\n\t{\n\t\tvar editor = new Editor();\n\t\tvar propertyChangedFired = false;\n\t\teditor.PropertyChanged += (s, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(Editor.PlaceholderColor))\n\t\t\t\tpropertyChangedFired = true;\n\t\t};\n\n\t\teditor.PlaceholderColor = Colors.Blue;\n\t\tAssert.True(propertyChangedFired);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnAutoSizeChange()\n\t{\n\t\tvar editor = new Editor();\n\t\tvar propertyChangedFired = false;\n\t\teditor.PropertyChanged += (s, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(Editor.AutoSize))\n\t\t\t\tpropertyChangedFired = true;\n\t\t};\n\n\t\teditor.AutoSize = true;\n\t\tAssert.True(propertyChangedFired);\n\t}\n\n\t[Fact]\n\tpublic void TextCanBeSetMultipleTimes()\n\t{\n\t\tvar editor = new Editor { Text = \"First line\\nSecond line\" };\n\t\tAssert.Equal(\"First line\\nSecond line\", editor.Text);\n\t\t\n\t\teditor.Text = \"Updated text\";\n\t\tAssert.Equal(\"Updated text\", editor.Text);\n\t\t\n\t\teditor.Text = \"\";\n\t\tAssert.Equal(\"\", editor.Text);\n\t}\n\n\t[Fact]\n\tpublic void MultiplePropertiesCanBeSetTogether()\n\t{\n\t\tvar editor = new Editor \n\t\t{ \n\t\t\tText = \"Test text\",\n\t\t\tTextColor = Colors.Red,\n\t\t\tPlaceholder = \"Enter text\",\n\t\t\tPlaceholderColor = Colors.LightGray,\n\t\t\tAutoSize = true\n\t\t};\n\t\t\n\t\tAssert.Equal(\"Test text\", editor.Text);\n\t\tAssert.Equal(Colors.Red, editor.TextColor);\n\t\tAssert.Equal(\"Enter text\", editor.Placeholder);\n\t\tAssert.Equal(Colors.LightGray, editor.PlaceholderColor);\n\t\tAssert.True(editor.AutoSize);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/EntryTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for the Entry view's default values, property setters, and change notifications.\n/// </summary>\n\npublic class EntryTests\n{\n\t[Fact]\n\tpublic void EntryCanBeCreated()\n\t{\n\t\tvar entry = new Entry();\n\t\tAssert.NotNull(entry);\n\t}\n\n\t[Fact]\n\tpublic void EntryInheritsFromView()\n\t{\n\t\tvar entry = new Entry();\n\t\tAssert.IsAssignableFrom<View>(entry);\n\t}\n\n\t[Fact]\n\tpublic void TextPropertyDefaultsToEmptyString()\n\t{\n\t\tvar entry = new Entry();\n\t\tAssert.Equal(\"\", entry.Text);\n\t}\n\n\t[Fact]\n\tpublic void TextPropertyCanBeSet()\n\t{\n\t\tvar entry = new Entry { Text = \"Hello World\" };\n\t\tAssert.Equal(\"Hello World\", entry.Text);\n\t}\n\n\t[Fact]\n\tpublic void TextColorPropertyDefaultsToNull()\n\t{\n\t\tvar entry = new Entry();\n\t\tAssert.Null(entry.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void TextColorPropertyCanBeSet()\n\t{\n\t\tvar color = Colors.Green;\n\t\tvar entry = new Entry { TextColor = color };\n\t\tAssert.Equal(color, entry.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void IsPasswordPropertyDefaultsToFalse()\n\t{\n\t\tvar entry = new Entry();\n\t\tAssert.False(entry.IsPassword);\n\t}\n\n\t[Fact]\n\tpublic void IsPasswordPropertyCanBeSet()\n\t{\n\t\tvar entry = new Entry { IsPassword = true };\n\t\tAssert.True(entry.IsPassword);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnTextChange()\n\t{\n\t\tvar entry = new Entry();\n\t\tvar propertyChangedFired = false;\n\t\tentry.PropertyChanged += (s, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(Entry.Text))\n\t\t\t\tpropertyChangedFired = true;\n\t\t};\n\n\t\tentry.Text = \"New Text\";\n\t\tAssert.True(propertyChangedFired);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnTextColorChange()\n\t{\n\t\tvar entry = new Entry();\n\t\tvar propertyChangedFired = false;\n\t\tentry.PropertyChanged += (s, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(Entry.TextColor))\n\t\t\t\tpropertyChangedFired = true;\n\t\t};\n\n\t\tentry.TextColor = Colors.Purple;\n\t\tAssert.True(propertyChangedFired);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnIsPasswordChange()\n\t{\n\t\tvar entry = new Entry();\n\t\tvar propertyChangedFired = false;\n\t\tentry.PropertyChanged += (s, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(Entry.IsPassword))\n\t\t\t\tpropertyChangedFired = true;\n\t\t};\n\n\t\tentry.IsPassword = true;\n\t\tAssert.True(propertyChangedFired);\n\t}\n\n\t[Fact]\n\tpublic void TextCanBeSetMultipleTimes()\n\t{\n\t\tvar entry = new Entry { Text = \"First\" };\n\t\tAssert.Equal(\"First\", entry.Text);\n\t\t\n\t\tentry.Text = \"Second\";\n\t\tAssert.Equal(\"Second\", entry.Text);\n\t\t\n\t\tentry.Text = \"\";\n\t\tAssert.Equal(\"\", entry.Text);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/GridLengthTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for GridLength functionality\n/// </summary>\npublic class GridLengthTests\n{\n\t[Fact]\n\tpublic void AutoPropertyIsAuto()\n\t{\n\t\tvar length = GridLength.Auto;\n\t\tAssert.True(length.IsAuto);\n\t\tAssert.False(length.IsAbsolute);\n\t\tAssert.False(length.IsStar);\n\t\tAssert.Equal(0, length.Value);\n\t\tAssert.Equal(GridUnitType.Auto, length.GridUnitType);\n\t}\n\n\t[Fact]\n\tpublic void StarPropertyIsStar()\n\t{\n\t\tvar length = GridLength.Star;\n\t\tAssert.True(length.IsStar);\n\t\tAssert.False(length.IsAuto);\n\t\tAssert.False(length.IsAbsolute);\n\t\tAssert.Equal(1, length.Value);\n\t\tAssert.Equal(GridUnitType.Star, length.GridUnitType);\n\t}\n\n\t[Fact]\n\tpublic void CanCreateAbsoluteLength()\n\t{\n\t\tvar length = new GridLength(100);\n\t\tAssert.True(length.IsAbsolute);\n\t\tAssert.False(length.IsAuto);\n\t\tAssert.False(length.IsStar);\n\t\tAssert.Equal(100, length.Value);\n\t\tAssert.Equal(GridUnitType.Absolute, length.GridUnitType);\n\t}\n\n\t[Fact]\n\tpublic void CanCreateStarLength()\n\t{\n\t\tvar length = new GridLength(2, GridUnitType.Star);\n\t\tAssert.True(length.IsStar);\n\t\tAssert.False(length.IsAuto);\n\t\tAssert.False(length.IsAbsolute);\n\t\tAssert.Equal(2, length.Value);\n\t\tAssert.Equal(GridUnitType.Star, length.GridUnitType);\n\t}\n\n\t[Fact]\n\tpublic void CanCreateAutoLength()\n\t{\n\t\tvar length = new GridLength(50, GridUnitType.Auto);\n\t\tAssert.True(length.IsAuto);\n\t\tAssert.False(length.IsAbsolute);\n\t\tAssert.False(length.IsStar);\n\t\tAssert.Equal(0, length.Value); // Auto always has value 0\n\t\tAssert.Equal(GridUnitType.Auto, length.GridUnitType);\n\t}\n\n\t[Fact]\n\tpublic void NegativeValueThrows()\n\t{\n\t\tAssert.Throws<ArgumentException>(() => new GridLength(-1));\n\t}\n\n\t[Fact]\n\tpublic void NaNValueThrows()\n\t{\n\t\tAssert.Throws<ArgumentException>(() => new GridLength(double.NaN));\n\t}\n\n\t[Fact]\n\tpublic void InfinityValueThrows()\n\t{\n\t\tAssert.Throws<ArgumentException>(() => new GridLength(double.PositiveInfinity));\n\t}\n\n\t[Fact]\n\tpublic void EqualityWorks()\n\t{\n\t\tvar length1 = new GridLength(100);\n\t\tvar length2 = new GridLength(100);\n\t\tvar length3 = new GridLength(200);\n\n\t\tAssert.Equal(length1, length2);\n\t\tAssert.NotEqual(length1, length3);\n\t\tAssert.True(length1 == length2);\n\t\tAssert.True(length1 != length3);\n\t\tAssert.True(length1.Equals(length2));\n\t\tAssert.False(length1.Equals(length3));\n\t}\n\n\t[Fact]\n\tpublic void AutoToStringIsAuto()\n\t{\n\t\tvar length = GridLength.Auto;\n\t\tAssert.Equal(\"Auto\", length.ToString());\n\t}\n\n\t[Fact]\n\tpublic void SingleStarToStringIsStar()\n\t{\n\t\tvar length = GridLength.Star;\n\t\tAssert.Equal(\"*\", length.ToString());\n\t}\n\n\t[Fact]\n\tpublic void MultipleStarToStringHasMultiplier()\n\t{\n\t\tvar length = new GridLength(2, GridUnitType.Star);\n\t\tAssert.Equal(\"2*\", length.ToString());\n\t}\n\n\t[Fact]\n\tpublic void AbsoluteToStringIsValue()\n\t{\n\t\tvar length = new GridLength(150);\n\t\tAssert.Equal(\"150\", length.ToString());\n\t}\n\n\t[Fact]\n\tpublic void GetHashCodeWorks()\n\t{\n\t\tvar length1 = new GridLength(100);\n\t\tvar length2 = new GridLength(100);\n\t\tvar length3 = GridLength.Auto;\n\n\t\tAssert.Equal(length1.GetHashCode(), length2.GetHashCode());\n\t\tAssert.NotEqual(length1.GetHashCode(), length3.GetHashCode());\n\t}\n\n\t[Fact]\n\tpublic void EqualsWithObjectWorks()\n\t{\n\t\tvar length = new GridLength(100);\n\t\tobject obj = new GridLength(100);\n\t\tobject differentObj = new GridLength(200);\n\t\tobject nullObj = null!;\n\t\tobject wrongType = \"string\";\n\n\t\tAssert.True(length.Equals(obj));\n\t\tAssert.False(length.Equals(differentObj));\n\t\tAssert.False(length.Equals(nullObj));\n\t\tAssert.False(length.Equals(wrongType));\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/GridTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for Grid functionality\n/// </summary>\npublic class GridTests\n{\n\t[Fact]\n\tpublic void CanCreate()\n\t{\n\t\tvar grid = new Grid();\n\t\tAssert.NotNull(grid);\n\t}\n\n\t[Fact]\n\tpublic void DefaultSpacingIsZero()\n\t{\n\t\tvar grid = new Grid();\n\t\tAssert.Equal(0, grid.RowSpacing);\n\t\tAssert.Equal(0, grid.ColumnSpacing);\n\t}\n\n\t[Fact]\n\tpublic void CanSetSpacing()\n\t{\n\t\tvar grid = new Grid\n\t\t{\n\t\t\tRowSpacing = 10,\n\t\t\tColumnSpacing = 20\n\t\t};\n\t\tAssert.Equal(10, grid.RowSpacing);\n\t\tAssert.Equal(20, grid.ColumnSpacing);\n\t}\n\n\t[Fact]\n\tpublic void RowDefinitionsStartsEmpty()\n\t{\n\t\tvar grid = new Grid();\n\t\tAssert.Empty(grid.RowDefinitions);\n\t}\n\n\t[Fact]\n\tpublic void ColumnDefinitionsStartsEmpty()\n\t{\n\t\tvar grid = new Grid();\n\t\tAssert.Empty(grid.ColumnDefinitions);\n\t}\n\n\t[Fact]\n\tpublic void CanAddRowDefinitions()\n\t{\n\t\tvar grid = new Grid();\n\t\tgrid.RowDefinitions.Add(new RowDefinition(GridLength.Auto));\n\t\tgrid.RowDefinitions.Add(new RowDefinition(new GridLength(100)));\n\t\tgrid.RowDefinitions.Add(new RowDefinition(GridLength.Star));\n\n\t\tAssert.Equal(3, grid.RowDefinitions.Count);\n\t\tAssert.True(grid.RowDefinitions[0].Height.IsAuto);\n\t\tAssert.True(grid.RowDefinitions[1].Height.IsAbsolute);\n\t\tAssert.Equal(100, grid.RowDefinitions[1].Height.Value);\n\t\tAssert.True(grid.RowDefinitions[2].Height.IsStar);\n\t}\n\n\t[Fact]\n\tpublic void CanAddColumnDefinitions()\n\t{\n\t\tvar grid = new Grid();\n\t\tgrid.ColumnDefinitions.Add(new ColumnDefinition(GridLength.Auto));\n\t\tgrid.ColumnDefinitions.Add(new ColumnDefinition(new GridLength(200)));\n\t\tgrid.ColumnDefinitions.Add(new ColumnDefinition(new GridLength(2, GridUnitType.Star)));\n\n\t\tAssert.Equal(3, grid.ColumnDefinitions.Count);\n\t\tAssert.True(grid.ColumnDefinitions[0].Width.IsAuto);\n\t\tAssert.True(grid.ColumnDefinitions[1].Width.IsAbsolute);\n\t\tAssert.Equal(200, grid.ColumnDefinitions[1].Width.Value);\n\t\tAssert.True(grid.ColumnDefinitions[2].Width.IsStar);\n\t\tAssert.Equal(2, grid.ColumnDefinitions[2].Width.Value);\n\t}\n\n\t[Fact]\n\tpublic void CanAddChildren()\n\t{\n\t\tvar grid = new Grid();\n\t\tvar label1 = new Label { Text = \"Test 1\" };\n\t\tvar label2 = new Label { Text = \"Test 2\" };\n\t\t\n\t\tgrid.Add(label1);\n\t\tgrid.Add(label2);\n\n\t\tAssert.Equal(2, grid.Children.Count);\n\t\tAssert.Equal(label1, grid.Children[0]);\n\t\tAssert.Equal(label2, grid.Children[1]);\n\t}\n\n\t[Fact]\n\tpublic void DefaultRowIsZero()\n\t{\n\t\tvar view = new Label { Text = \"Test\" };\n\t\tAssert.Equal(0, Grid.GetRow(view));\n\t}\n\n\t[Fact]\n\tpublic void DefaultColumnIsZero()\n\t{\n\t\tvar view = new Label { Text = \"Test\" };\n\t\tAssert.Equal(0, Grid.GetColumn(view));\n\t}\n\n\t[Fact]\n\tpublic void DefaultRowSpanIsOne()\n\t{\n\t\tvar view = new Label { Text = \"Test\" };\n\t\tAssert.Equal(1, Grid.GetRowSpan(view));\n\t}\n\n\t[Fact]\n\tpublic void DefaultColumnSpanIsOne()\n\t{\n\t\tvar view = new Label { Text = \"Test\" };\n\t\tAssert.Equal(1, Grid.GetColumnSpan(view));\n\t}\n\n\t[Fact]\n\tpublic void CanSetRow()\n\t{\n\t\tvar view = new Label { Text = \"Test\" };\n\t\tGrid.SetRow(view, 2);\n\t\tAssert.Equal(2, Grid.GetRow(view));\n\t}\n\n\t[Fact]\n\tpublic void CanSetColumn()\n\t{\n\t\tvar view = new Label { Text = \"Test\" };\n\t\tGrid.SetColumn(view, 3);\n\t\tAssert.Equal(3, Grid.GetColumn(view));\n\t}\n\n\t[Fact]\n\tpublic void CanSetRowSpan()\n\t{\n\t\tvar view = new Label { Text = \"Test\" };\n\t\tGrid.SetRowSpan(view, 2);\n\t\tAssert.Equal(2, Grid.GetRowSpan(view));\n\t}\n\n\t[Fact]\n\tpublic void CanSetColumnSpan()\n\t{\n\t\tvar view = new Label { Text = \"Test\" };\n\t\tGrid.SetColumnSpan(view, 3);\n\t\tAssert.Equal(3, Grid.GetColumnSpan(view));\n\t}\n\n\t[Fact]\n\tpublic void RowCannotBeNegative()\n\t{\n\t\tvar view = new Label { Text = \"Test\" };\n\t\tAssert.Throws<ArgumentOutOfRangeException>(() => Grid.SetRow(view, -1));\n\t}\n\n\t[Fact]\n\tpublic void ColumnCannotBeNegative()\n\t{\n\t\tvar view = new Label { Text = \"Test\" };\n\t\tAssert.Throws<ArgumentOutOfRangeException>(() => Grid.SetColumn(view, -1));\n\t}\n\n\t[Fact]\n\tpublic void RowSpanCannotBeLessThanOne()\n\t{\n\t\tvar view = new Label { Text = \"Test\" };\n\t\tAssert.Throws<ArgumentOutOfRangeException>(() => Grid.SetRowSpan(view, 0));\n\t}\n\n\t[Fact]\n\tpublic void ColumnSpanCannotBeLessThanOne()\n\t{\n\t\tvar view = new Label { Text = \"Test\" };\n\t\tAssert.Throws<ArgumentOutOfRangeException>(() => Grid.SetColumnSpan(view, 0));\n\t}\n\n\t[Fact]\n\tpublic void CanCreateComplexGrid()\n\t{\n\t\tvar grid = new Grid\n\t\t{\n\t\t\tRowSpacing = 5,\n\t\t\tColumnSpacing = 10\n\t\t};\n\n\t\tgrid.RowDefinitions.Add(new RowDefinition(GridLength.Auto));\n\t\tgrid.RowDefinitions.Add(new RowDefinition(GridLength.Star));\n\t\tgrid.RowDefinitions.Add(new RowDefinition(new GridLength(50)));\n\n\t\tgrid.ColumnDefinitions.Add(new ColumnDefinition(new GridLength(100)));\n\t\tgrid.ColumnDefinitions.Add(new ColumnDefinition(new GridLength(2, GridUnitType.Star)));\n\t\tgrid.ColumnDefinitions.Add(new ColumnDefinition(GridLength.Auto));\n\n\t\tvar label1 = new Label { Text = \"Header\" };\n\t\tGrid.SetRow(label1, 0);\n\t\tGrid.SetColumn(label1, 0);\n\t\tGrid.SetColumnSpan(label1, 3);\n\n\t\tvar label2 = new Label { Text = \"Content\" };\n\t\tGrid.SetRow(label2, 1);\n\t\tGrid.SetColumn(label2, 1);\n\n\t\tvar label3 = new Label { Text = \"Footer\" };\n\t\tGrid.SetRow(label3, 2);\n\t\tGrid.SetColumn(label3, 0);\n\t\tGrid.SetColumnSpan(label3, 3);\n\n\t\tgrid.Add(label1);\n\t\tgrid.Add(label2);\n\t\tgrid.Add(label3);\n\n\t\tAssert.Equal(3, grid.RowDefinitions.Count);\n\t\tAssert.Equal(3, grid.ColumnDefinitions.Count);\n\t\tAssert.Equal(3, grid.Children.Count);\n\n\t\tAssert.Equal(0, Grid.GetRow(label1));\n\t\tAssert.Equal(0, Grid.GetColumn(label1));\n\t\tAssert.Equal(3, Grid.GetColumnSpan(label1));\n\n\t\tAssert.Equal(1, Grid.GetRow(label2));\n\t\tAssert.Equal(1, Grid.GetColumn(label2));\n\n\t\tAssert.Equal(2, Grid.GetRow(label3));\n\t\tAssert.Equal(0, Grid.GetColumn(label3));\n\t\tAssert.Equal(3, Grid.GetColumnSpan(label3));\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnRowSpacingChange()\n\t{\n\t\tstring? property = null;\n\t\tvar grid = new Grid();\n\t\tgrid.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\tgrid.RowSpacing = 15;\n\n\t\tAssert.Equal(nameof(grid.RowSpacing), property);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnColumnSpacingChange()\n\t{\n\t\tstring? property = null;\n\t\tvar grid = new Grid();\n\t\tgrid.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\tgrid.ColumnSpacing = 20;\n\n\t\tAssert.Equal(nameof(grid.ColumnSpacing), property);\n\t}\n\n\t[Fact]\n\tpublic void DefaultPaddingIsZero()\n\t{\n\t\tvar grid = new Grid();\n\t\tAssert.Equal(0.0, grid.Padding);\n\t}\n\n\t[Fact]\n\tpublic void CanSetPadding()\n\t{\n\t\tvar grid = new Grid\n\t\t{\n\t\t\tPadding = 15.0\n\t\t};\n\t\tAssert.Equal(15.0, grid.Padding);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnPaddingChange()\n\t{\n\t\tstring? property = null;\n\t\tvar grid = new Grid();\n\t\tgrid.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\t\n\t\tgrid.Padding = 25.0;\n\n\t\tAssert.Equal(nameof(grid.Padding), property);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/ImageButtonTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for the ImageButton control\n/// </summary>\npublic class ImageButtonTests\n{\n\t[Fact]\n\tpublic void ImageButtonCreation()\n\t{\n\t\tvar imageButton = new ImageButton();\n\t\tAssert.NotNull(imageButton);\n\t\tAssert.Equal(\"\", imageButton.Source);\n\t\tAssert.Null(imageButton.Clicked);\n\t}\n\n\t[Fact]\n\tpublic void SourcePropertyWorks()\n\t{\n\t\tvar imageButton = new ImageButton { Source = \"spice\" };\n\t\tAssert.Equal(\"spice\", imageButton.Source);\n\t}\n\n\t[Fact]\n\tpublic void SourcePropertyChangedEvent()\n\t{\n\t\tstring? property = null;\n\t\tvar imageButton = new ImageButton();\n\t\timageButton.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\timageButton.Source = \"dotnet_bot\";\n\n\t\tAssert.Equal(nameof(imageButton.Source), property);\n\t\tAssert.Equal(\"dotnet_bot\", imageButton.Source);\n\t}\n\n\t[Fact]\n\tpublic void ClickedActionWorks()\n\t{\n\t\tvar imageButton = new ImageButton();\n\t\tAssert.Null(imageButton.Clicked);\n\n\t\timageButton.Clicked = _ => { };\n\t\tAssert.NotNull(imageButton.Clicked);\n\t}\n\n\t[Fact]\n\tpublic void ClickedActionCanBeCleared()\n\t{\n\t\tvar imageButton = new ImageButton\n\t\t{\n\t\t\tClicked = _ => { }\n\t\t};\n\n\t\timageButton.Clicked = null;\n\t\tAssert.Null(imageButton.Clicked);\n\t}\n\n\t[Fact]\n\tpublic void ImageButtonInheritsFromView()\n\t{\n\t\tvar imageButton = new ImageButton();\n\t\tAssert.IsAssignableFrom<View>(imageButton);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/ImageTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Unit tests for the cross-platform Image view behavior and properties.\n/// </summary>\n\npublic class ImageTests\n{\n\t[Fact]\n\tpublic void ImageCanBeCreated()\n\t{\n\t\tvar image = new Image();\n\t\tAssert.NotNull(image);\n\t}\n\n\t[Fact]\n\tpublic void ImageInheritsFromView()\n\t{\n\t\tvar image = new Image();\n\t\tAssert.IsAssignableFrom<View>(image);\n\t}\n\n\t[Fact]\n\tpublic void SourcePropertyDefaultsToEmptyString()\n\t{\n\t\tvar image = new Image();\n\t\tAssert.Equal(\"\", image.Source);\n\t}\n\n\t[Fact]\n\tpublic void SourcePropertyCanBeSet()\n\t{\n\t\tvar image = new Image { Source = \"spice\" };\n\t\tAssert.Equal(\"spice\", image.Source);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnSourceChange()\n\t{\n\t\tvar image = new Image();\n\t\tvar propertyChangedFired = false;\n\t\timage.PropertyChanged += (s, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(Image.Source))\n\t\t\t\tpropertyChangedFired = true;\n\t\t};\n\n\t\timage.Source = \"icon\";\n\t\tAssert.True(propertyChangedFired);\n\t}\n\n\t[Fact]\n\tpublic void SourceCanBeSetMultipleTimes()\n\t{\n\t\tvar image = new Image { Source = \"first\" };\n\t\tAssert.Equal(\"first\", image.Source);\n\t\t\n\t\timage.Source = \"second\";\n\t\tAssert.Equal(\"second\", image.Source);\n\t\t\n\t\timage.Source = \"\";\n\t\tAssert.Equal(\"\", image.Source);\n\t}\n\n\t[Fact]\n\tpublic void MultipleImageInstancesAreIndependent()\n\t{\n\t\tvar image1 = new Image { Source = \"icon1\" };\n\t\tvar image2 = new Image { Source = \"icon2\" };\n\n\t\tAssert.Equal(\"icon1\", image1.Source);\n\t\tAssert.Equal(\"icon2\", image2.Source);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/LabelTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for the cross-platform Label view, covering creation, inheritance, defaults, and property changes.\n/// </summary>\n\npublic class LabelTests\n{\n\t[Fact]\n\tpublic void LabelCanBeCreated()\n\t{\n\t\tvar label = new Label();\n\t\tAssert.NotNull(label);\n\t}\n\n\t[Fact]\n\tpublic void LabelInheritsFromView()\n\t{\n\t\tvar label = new Label();\n\t\tAssert.IsAssignableFrom<View>(label);\n\t}\n\n\t[Fact]\n\tpublic void TextPropertyDefaultsToEmptyString()\n\t{\n\t\tvar label = new Label();\n\t\tAssert.Equal(\"\", label.Text);\n\t}\n\n\t[Fact]\n\tpublic void TextPropertyCanBeSet()\n\t{\n\t\tvar label = new Label { Text = \"Hello World\" };\n\t\tAssert.Equal(\"Hello World\", label.Text);\n\t}\n\n\t[Fact]\n\tpublic void TextColorPropertyDefaultsToNull()\n\t{\n\t\tvar label = new Label();\n\t\tAssert.Null(label.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void TextColorPropertyCanBeSet()\n\t{\n\t\tvar color = Colors.Red;\n\t\tvar label = new Label { TextColor = color };\n\t\tAssert.Equal(color, label.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnTextChange()\n\t{\n\t\tvar label = new Label();\n\t\tvar propertyChangedFired = false;\n\t\tlabel.PropertyChanged += (s, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(Label.Text))\n\t\t\t\tpropertyChangedFired = true;\n\t\t};\n\n\t\tlabel.Text = \"New Text\";\n\t\tAssert.True(propertyChangedFired);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnTextColorChange()\n\t{\n\t\tvar label = new Label();\n\t\tvar propertyChangedFired = false;\n\t\tlabel.PropertyChanged += (s, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(Label.TextColor))\n\t\t\t\tpropertyChangedFired = true;\n\t\t};\n\n\t\tlabel.TextColor = Colors.Blue;\n\t\tAssert.True(propertyChangedFired);\n\t}\n\n\t[Fact]\n\tpublic void TextCanBeSetToLongString()\n\t{\n\t\tvar longText = new string('x', 1000);\n\t\tvar label = new Label { Text = longText };\n\t\tAssert.Equal(longText, label.Text);\n\t\tAssert.Equal(1000, label.Text.Length);\n\t}\n\n\t[Fact]\n\tpublic void TextCanBeSetMultipleTimes()\n\t{\n\t\tvar label = new Label { Text = \"First\" };\n\t\tAssert.Equal(\"First\", label.Text);\n\t\t\n\t\tlabel.Text = \"Second\";\n\t\tAssert.Equal(\"Second\", label.Text);\n\t\t\n\t\tlabel.Text = \"\";\n\t\tAssert.Equal(\"\", label.Text);\n\t}\n\n\t[Fact]\n\tpublic void MultipleLabelInstancesAreIndependent()\n\t{\n\t\tvar label1 = new Label { Text = \"Label 1\", TextColor = Colors.Red };\n\t\tvar label2 = new Label { Text = \"Label 2\", TextColor = Colors.Blue };\n\n\t\tAssert.Equal(\"Label 1\", label1.Text);\n\t\tAssert.Equal(\"Label 2\", label2.Text);\n\t\tAssert.Equal(Colors.Red, label1.TextColor);\n\t\tAssert.Equal(Colors.Blue, label2.TextColor);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/LayoutOptionsTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for LayoutOptions struct\n/// </summary>\npublic class LayoutOptionsTests\n{\n\t[Fact]\n\tpublic void LayoutOptionsStartHasCorrectAlignment()\n\t{\n\t\tAssert.Equal(LayoutAlignment.Start, LayoutOptions.Start.Alignment);\n\t\tAssert.False(LayoutOptions.Start.Expands);\n\t}\n\n\t[Fact]\n\tpublic void LayoutOptionsCenterHasCorrectAlignment()\n\t{\n\t\tAssert.Equal(LayoutAlignment.Center, LayoutOptions.Center.Alignment);\n\t\tAssert.False(LayoutOptions.Center.Expands);\n\t}\n\n\t[Fact]\n\tpublic void LayoutOptionsEndHasCorrectAlignment()\n\t{\n\t\tAssert.Equal(LayoutAlignment.End, LayoutOptions.End.Alignment);\n\t\tAssert.False(LayoutOptions.End.Expands);\n\t}\n\n\t[Fact]\n\tpublic void LayoutOptionsFillHasCorrectAlignment()\n\t{\n\t\tAssert.Equal(LayoutAlignment.Fill, LayoutOptions.Fill.Alignment);\n\t\tAssert.False(LayoutOptions.Fill.Expands);\n\t}\n\n\t[Fact]\n\tpublic void LayoutOptionsCanBeConstructed()\n\t{\n\t\tvar options = new LayoutOptions(LayoutAlignment.Center, false);\n\t\tAssert.Equal(LayoutAlignment.Center, options.Alignment);\n\t\tAssert.False(options.Expands);\n\t}\n\n\t[Fact]\n\tpublic void LayoutOptionsCanBeConstructedWithExpands()\n\t{\n\t\tvar options = new LayoutOptions(LayoutAlignment.Start, true);\n\t\tAssert.Equal(LayoutAlignment.Start, options.Alignment);\n\t\tAssert.True(options.Expands);\n\t}\n\n\t[Fact]\n\tpublic void LayoutOptionsEqualityWorks()\n\t{\n\t\tvar options1 = LayoutOptions.Center;\n\t\tvar options2 = LayoutOptions.Center;\n\t\tvar options3 = LayoutOptions.Start;\n\n\t\tAssert.Equal(options1, options2);\n\t\tAssert.NotEqual(options1, options3);\n\t\tAssert.True(options1 == options2);\n\t\tAssert.False(options1 == options3);\n\t\tAssert.False(options1 != options2);\n\t\tAssert.True(options1 != options3);\n\t}\n\n\t[Fact]\n\tpublic void LayoutOptionsAlignmentCanBeSet()\n\t{\n\t\tvar options = LayoutOptions.Center;\n\t\toptions.Alignment = LayoutAlignment.End;\n\t\tAssert.Equal(LayoutAlignment.End, options.Alignment);\n\t}\n\n\t[Fact]\n\tpublic void LayoutOptionsExpandsCanBeSet()\n\t{\n\t\tvar options = LayoutOptions.Center;\n\t\toptions.Expands = true;\n\t\tAssert.True(options.Expands);\n\t}\n\n\t[Fact]\n\tpublic void LayoutOptionsGetHashCodeWorks()\n\t{\n\t\tvar options1 = LayoutOptions.Center;\n\t\tvar options2 = LayoutOptions.Center;\n\t\tvar options3 = LayoutOptions.Start;\n\n\t\tAssert.Equal(options1.GetHashCode(), options2.GetHashCode());\n\t\tAssert.NotEqual(options1.GetHashCode(), options3.GetHashCode());\n\t}\n\n\t[Fact]\n\tpublic void LayoutOptionsEqualsWorksWithObject()\n\t{\n\t\tvar options1 = LayoutOptions.Center;\n\t\tobject options2 = LayoutOptions.Center;\n\t\tobject options3 = LayoutOptions.Start;\n\n\t\tAssert.True(options1.Equals(options2));\n\t\tAssert.False(options1.Equals(options3));\n\t\tAssert.False(options1.Equals(null));\n\t\tAssert.False(options1.Equals(\"string\"));\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/MarginTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for Margin property on View\n/// </summary>\npublic class MarginTests\n{\n\t[Fact]\n\tpublic void MarginDefaultsToZero()\n\t{\n\t\tvar view = new View();\n\t\tAssert.Equal(new Thickness(0), view.Margin);\n\t\tAssert.True(view.Margin.IsEmpty);\n\t}\n\n\t[Fact]\n\tpublic void CanSetUniformMargin()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tMargin = 10\n\t\t};\n\t\tAssert.Equal(new Thickness(10), view.Margin);\n\t\tAssert.Equal(10, view.Margin.Left);\n\t\tAssert.Equal(10, view.Margin.Top);\n\t\tAssert.Equal(10, view.Margin.Right);\n\t\tAssert.Equal(10, view.Margin.Bottom);\n\t}\n\n\t[Fact]\n\tpublic void CanSetHorizontalVerticalMargin()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tMargin = new Thickness(10, 20)\n\t\t};\n\t\tAssert.Equal(10, view.Margin.Left);\n\t\tAssert.Equal(20, view.Margin.Top);\n\t\tAssert.Equal(10, view.Margin.Right);\n\t\tAssert.Equal(20, view.Margin.Bottom);\n\t}\n\n\t[Fact]\n\tpublic void CanSetIndividualMargins()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tMargin = new Thickness(5, 10, 15, 20)\n\t\t};\n\t\tAssert.Equal(5, view.Margin.Left);\n\t\tAssert.Equal(10, view.Margin.Top);\n\t\tAssert.Equal(15, view.Margin.Right);\n\t\tAssert.Equal(20, view.Margin.Bottom);\n\t}\n\n\t[Fact]\n\tpublic void MarginPropertyChangedEventFires()\n\t{\n\t\tstring? propertyName = null;\n\t\tvar view = new View();\n\t\tview.PropertyChanged += (sender, e) => propertyName = e.PropertyName;\n\n\t\tview.Margin = 10;\n\t\tAssert.Equal(nameof(view.Margin), propertyName);\n\t\tAssert.Equal(new Thickness(10), view.Margin);\n\t}\n\n\t[Fact]\n\tpublic void MarginWorksOnButton()\n\t{\n\t\tvar button = new Button\n\t\t{\n\t\t\tText = \"Click me\",\n\t\t\tMargin = 15\n\t\t};\n\t\tAssert.Equal(new Thickness(15), button.Margin);\n\t\tAssert.Equal(\"Click me\", button.Text);\n\t}\n\n\t[Fact]\n\tpublic void MarginWorksOnLabel()\n\t{\n\t\tvar label = new Label\n\t\t{\n\t\t\tText = \"Hello\",\n\t\t\tMargin = new Thickness(5, 10, 15, 20)\n\t\t};\n\t\tAssert.Equal(5, label.Margin.Left);\n\t\tAssert.Equal(10, label.Margin.Top);\n\t\tAssert.Equal(15, label.Margin.Right);\n\t\tAssert.Equal(20, label.Margin.Bottom);\n\t\tAssert.Equal(\"Hello\", label.Text);\n\t}\n\n\t[Fact]\n\tpublic void MarginWorksOnContentView()\n\t{\n\t\tvar contentView = new ContentView\n\t\t{\n\t\t\tMargin = 10,\n\t\t\tContent = new Label { Text = \"Test\" }\n\t\t};\n\t\tAssert.Equal(new Thickness(10), contentView.Margin);\n\t\tAssert.NotNull(contentView.Content);\n\t}\n\n\t[Fact]\n\tpublic void MarginWorksOnBoxView()\n\t{\n\t\tvar boxView = new BoxView\n\t\t{\n\t\t\tMargin = new Thickness(8),\n\t\t\tBackgroundColor = Colors.Red\n\t\t};\n\t\tAssert.Equal(new Thickness(8), boxView.Margin);\n\t\tAssert.Equal(Colors.Red, boxView.BackgroundColor);\n\t}\n\n\t[Fact]\n\tpublic void CanChangeMargin()\n\t{\n\t\tvar view = new View { Margin = 10 };\n\t\tAssert.Equal(new Thickness(10), view.Margin);\n\n\t\tview.Margin = 20;\n\t\tAssert.Equal(new Thickness(20), view.Margin);\n\n\t\tview.Margin = new Thickness(5, 10, 15, 20);\n\t\tAssert.Equal(5, view.Margin.Left);\n\t\tAssert.Equal(10, view.Margin.Top);\n\t\tAssert.Equal(15, view.Margin.Right);\n\t\tAssert.Equal(20, view.Margin.Bottom);\n\t}\n\n\t[Fact]\n\tpublic void MarginWorksWithAlignment()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tMargin = 10,\n\t\t\tHorizontalOptions = LayoutOptions.Start,\n\t\t\tVerticalOptions = LayoutOptions.Start\n\t\t};\n\t\tAssert.Equal(new Thickness(10), view.Margin);\n\t\tAssert.Equal(LayoutOptions.Start, view.HorizontalOptions);\n\t\tAssert.Equal(LayoutOptions.Start, view.VerticalOptions);\n\t}\n\n\t[Fact]\n\tpublic void MarginWorksWithBackgroundColor()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tMargin = 10,\n\t\t\tBackgroundColor = Colors.Blue\n\t\t};\n\t\tAssert.Equal(new Thickness(10), view.Margin);\n\t\tAssert.Equal(Colors.Blue, view.BackgroundColor);\n\t}\n\n\t[Fact]\n\tpublic void MarginAndPaddingAreSeparateProperties()\n\t{\n\t\tvar border = new Border\n\t\t{\n\t\t\tMargin = 10,\n\t\t\tPadding = 5\n\t\t};\n\t\tAssert.Equal(new Thickness(10), border.Margin);\n\t\tAssert.Equal(5.0, border.Padding);\n\t}\n\n\t[Fact]\n\tpublic void CanSetMarginInStackLayout()\n\t{\n\t\tvar stackView = new StackLayout();\n\t\tvar button = new Button\n\t\t{\n\t\t\tText = \"Test\",\n\t\t\tMargin = 10\n\t\t};\n\n\t\tstackView.Add(button);\n\t\tAssert.Single(stackView.Children);\n\t\tAssert.Same(button, stackView.Children[0]);\n\t\tAssert.Equal(new Thickness(10), button.Margin);\n\t}\n\n\t[Fact]\n\tpublic void MultipleChildrenCanHaveDifferentMargins()\n\t{\n\t\tvar stackView = new StackLayout();\n\t\tvar button1 = new Button { Text = \"Button 1\", Margin = 5 };\n\t\tvar button2 = new Button { Text = \"Button 2\", Margin = 10 };\n\t\tvar label = new Label { Text = \"Label\", Margin = new Thickness(2, 4, 6, 8) };\n\n\t\tstackView.Add(button1);\n\t\tstackView.Add(button2);\n\t\tstackView.Add(label);\n\n\t\tAssert.Equal(new Thickness(5), button1.Margin);\n\t\tAssert.Equal(new Thickness(10), button2.Margin);\n\t\tAssert.Equal(2, label.Margin.Left);\n\t\tAssert.Equal(4, label.Margin.Top);\n\t\tAssert.Equal(6, label.Margin.Right);\n\t\tAssert.Equal(8, label.Margin.Bottom);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/ModalPresentationTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Contains unit tests verifying the behavior of modal presentation on View.\n/// </summary>\npublic class ModalPresentationTests\n{\n\tclass TestView : View\n\t{\n\t\tpublic TestView()\n\t\t{\n\t\t\tTitle = \"Test Modal\";\n\t\t}\n\t}\n\n\tclass SecondView : View\n\t{\n\t\tpublic SecondView()\n\t\t{\n\t\t\tTitle = \"Second Modal\";\n\t\t}\n\t}\n\n\t[Fact]\n\tpublic void PresentAsyncWithViewDoesNotThrow()\n\t{\n\t\tvar view = new TestView();\n\t\tvar modal = new SecondView();\n\n\t\tvar task = view.PresentAsync(modal);\n\t\tAssert.NotNull(task);\n\t}\n\n\t[Fact]\n\tpublic void PresentAsyncWithFactoryDoesNotThrow()\n\t{\n\t\tvar view = new TestView();\n\n\t\tvar task = view.PresentAsync(() => new SecondView());\n\t\tAssert.NotNull(task);\n\t}\n\n\t[Fact]\n\tpublic void PresentAsyncGenericDoesNotThrow()\n\t{\n\t\tvar view = new TestView();\n\n\t\tvar task = view.PresentAsync<SecondView>();\n\t\tAssert.NotNull(task);\n\t}\n\n\t[Fact]\n\tpublic void DismissAsyncDoesNotThrow()\n\t{\n\t\tvar view = new TestView();\n\n\t\tvar task = view.DismissAsync();\n\t\tAssert.NotNull(task);\n\t}\n\n\t[Fact]\n\tpublic async Task PresentAsyncWithNullViewThrows()\n\t{\n\t\tvar view = new TestView();\n\t\tawait Assert.ThrowsAsync<ArgumentNullException>(() => view.PresentAsync((View)null!));\n\t}\n\n\t[Fact]\n\tpublic async Task PresentAsyncWithNullFactoryThrows()\n\t{\n\t\tvar view = new TestView();\n\t\tawait Assert.ThrowsAsync<ArgumentNullException>(() => view.PresentAsync((Func<View>)null!));\n\t}\n\n\t[Fact]\n\tpublic void PresentAsyncWithFactoryCallsFactory()\n\t{\n\t\tvar view = new TestView();\n\t\tvar factoryCalled = false;\n\n\t\tview.PresentAsync(() =>\n\t\t{\n\t\t\tfactoryCalled = true;\n\t\t\treturn new SecondView();\n\t\t});\n\n\t\tAssert.True(factoryCalled);\n\t}\n\n\t[Fact]\n\tpublic async Task PresentAsyncReturnsCompletedTask()\n\t{\n\t\tvar view = new TestView();\n\t\tvar modal = new SecondView();\n\n\t\t// Should complete without throwing\n\t\tawait view.PresentAsync(modal);\n\t}\n\n\t[Fact]\n\tpublic async Task DismissAsyncReturnsCompletedTask()\n\t{\n\t\tvar view = new TestView();\n\n\t\t// Should complete without throwing\n\t\tawait view.DismissAsync();\n\t}\n\n\t[Fact]\n\tpublic void PresentAsyncIsAvailableOnAnyView()\n\t{\n\t\t// Modal presentation should work from any View, not just Application\n\t\tvar label = new View { Title = \"Label\" };\n\t\tvar task = label.PresentAsync<TestView>();\n\t\tAssert.NotNull(task);\n\t}\n\n\t[Fact]\n\tpublic void PresentAsyncGenericCreatesCorrectType()\n\t{\n\t\tvar view = new TestView();\n\n\t\t// Should not throw — creates SecondView via parameterless ctor\n\t\tvar task = view.PresentAsync<SecondView>();\n\t\tAssert.NotNull(task);\n\t}\n\n\t[Fact]\n\tpublic void ApplicationIsJustAViewWithMain()\n\t{\n\t\tvar app = new Application();\n\t\tAssert.Null(app.Main);\n\t\tAssert.IsAssignableFrom<View>(app);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/NavigationViewTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Contains unit tests verifying the behavior of the NavigationView.\n/// </summary>\npublic class NavigationViewTests\n{\n\tclass TestView : View\n\t{\n\t\tpublic TestView()\n\t\t{\n\t\t\tTitle = \"Test View\";\n\t\t}\n\t}\n\n\tclass SecondView : View\n\t{\n\t\tpublic SecondView()\n\t\t{\n\t\t\tTitle = \"Second View\";\n\t\t}\n\t}\n\n\t[Fact]\n\tpublic void NavigationViewCanBeCreated()\n\t{\n\t\tvar rootView = new TestView();\n\t\tvar nav = new NavigationView(rootView);\n\t\tAssert.NotNull(nav);\n\t}\n\n\t[Fact]\n\tpublic void NavigationViewInheritsFromView()\n\t{\n\t\tvar rootView = new TestView();\n\t\tvar nav = new NavigationView(rootView);\n\t\tAssert.IsAssignableFrom<View>(nav);\n\t}\n\n\t[Fact]\n\tpublic void NavigationViewCanBeCreatedWithFactory()\n\t{\n\t\tvar nav = new NavigationView(() => new TestView());\n\t\tAssert.NotNull(nav);\n\t}\n\n\t[Fact]\n\tpublic void NavigationViewGenericCanBeCreated()\n\t{\n\t\tvar nav = new NavigationView<TestView>();\n\t\tAssert.NotNull(nav);\n\t}\n\n\t[Fact]\n\tpublic void NavigationViewGenericInheritsFromNavigationView()\n\t{\n\t\tvar nav = new NavigationView<TestView>();\n\t\tAssert.IsAssignableFrom<NavigationView>(nav);\n\t}\n\n\t[Fact]\n\tpublic void PushSetsNavigationProperty()\n\t{\n\t\tvar rootView = new TestView();\n\t\tvar nav = new NavigationView(rootView);\n\t\t\n\t\tAssert.Equal(nav, rootView.Navigation);\n\t}\n\n\t[Fact]\n\tpublic void PushWithViewSetsNavigation()\n\t{\n\t\tvar rootView = new TestView();\n\t\tvar nav = new NavigationView(rootView);\n\t\t\n\t\tvar secondView = new SecondView();\n\t\tnav.Push(secondView);\n\t\t\n\t\tAssert.Equal(nav, secondView.Navigation);\n\t}\n\n\t[Fact]\n\tpublic void PushWithFactorySetsNavigation()\n\t{\n\t\tvar nav = new NavigationView<TestView>();\n\t\t\n\t\tSecondView? capturedView = null;\n\t\tnav.Push(() =>\n\t\t{\n\t\t\tvar view = new SecondView();\n\t\t\tcapturedView = view;\n\t\t\treturn view;\n\t\t});\n\t\t\n\t\tAssert.NotNull(capturedView);\n\t\tAssert.Equal(nav, capturedView.Navigation);\n\t}\n\n\t[Fact]\n\tpublic void PushGenericSetsNavigation()\n\t{\n\t\tvar rootView = new TestView();\n\t\tvar nav = new NavigationView(rootView);\n\t\t\n\t\t// We can't directly check the pushed view without platform code,\n\t\t// but we can verify the method doesn't throw\n\t\tnav.Push<SecondView>();\n\t}\n\n\t[Fact]\n\tpublic void PopDoesNotThrow()\n\t{\n\t\tvar nav = new NavigationView<TestView>();\n\t\tnav.Pop(); // Should not throw even if empty\n\t}\n\n\t[Fact]\n\tpublic void PopToRootDoesNotThrow()\n\t{\n\t\tvar nav = new NavigationView<TestView>();\n\t\tnav.PopToRoot(); // Should not throw even if only root\n\t}\n\n\t[Fact]\n\tpublic void PushWithNullViewThrows()\n\t{\n\t\tvar nav = new NavigationView<TestView>();\n\t\tAssert.Throws<ArgumentNullException>(() => nav.Push((View)null!));\n\t}\n\n\t[Fact]\n\tpublic void PushWithNullFactoryThrows()\n\t{\n\t\tvar nav = new NavigationView<TestView>();\n\t\tAssert.Throws<ArgumentNullException>(() => nav.Push((Func<View>)null!));\n\t}\n\n\t[Fact]\n\tpublic void NavigationViewConstructorWithNullRootThrows()\n\t{\n\t\tAssert.Throws<ArgumentNullException>(() => new NavigationView((View)null!));\n\t}\n\n\t[Fact]\n\tpublic void NavigationViewConstructorWithNullFactoryThrows()\n\t{\n\t\tAssert.Throws<ArgumentNullException>(() => new NavigationView((Func<View>)null!));\n\t}\n\n\t[Fact]\n\tpublic void TitlePropertyDefaultsToEmptyString()\n\t{\n\t\tvar view = new View();\n\t\tAssert.Equal(\"\", view.Title);\n\t}\n\n\t[Fact]\n\tpublic void TitlePropertyCanBeSet()\n\t{\n\t\tvar view = new View { Title = \"My Title\" };\n\t\tAssert.Equal(\"My Title\", view.Title);\n\t}\n\n\t[Fact]\n\tpublic void NavigationPropertyDefaultsToNull()\n\t{\n\t\tvar view = new View();\n\t\tAssert.Null(view.Navigation);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnTitleChange()\n\t{\n\t\tvar view = new View();\n\t\tvar propertyChangedFired = false;\n\t\tview.PropertyChanged += (s, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(View.Title))\n\t\t\t\tpropertyChangedFired = true;\n\t\t};\n\n\t\tview.Title = \"New Title\";\n\t\tAssert.True(propertyChangedFired);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/PickerTests.cs",
    "content": "using System.Collections.ObjectModel;\nusing Microsoft.Maui.Graphics;\n\nnamespace Spice.Tests;\n\n/// <summary>\n/// Tests for the Picker control\n/// </summary>\npublic class PickerTests\n{\n\t[Fact]\n\tpublic void PickerPropertyChangedWorks()\n\t{\n\t\tstring? property = null;\n\t\tvar picker = new Picker();\n\t\tpicker.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\tpicker.Title = \"Select an option\";\n\n\t\tAssert.Equal(nameof(picker.Title), property);\n\t}\n\n\t[Fact]\n\tpublic void PickerItemsCanBeAdded()\n\t{\n\t\tvar picker = new Picker();\n\t\tpicker.Items.Add(\"Item 1\");\n\t\tpicker.Items.Add(\"Item 2\");\n\n\t\tAssert.Equal(2, picker.Items.Count);\n\t\tAssert.Equal(\"Item 1\", picker.Items[0]);\n\t\tAssert.Equal(\"Item 2\", picker.Items[1]);\n\t}\n\n\t[Fact]\n\tpublic void PickerSelectedIndexDefault()\n\t{\n\t\tvar picker = new Picker();\n\t\t\n\t\tAssert.Equal(-1, picker.SelectedIndex);\n\t\tAssert.Null(picker.SelectedItem);\n\t}\n\n\t[Fact]\n\tpublic void PickerSelectedIndexUpdates()\n\t{\n\t\tvar picker = new Picker();\n\t\tpicker.Items.Add(\"Option 1\");\n\t\tpicker.Items.Add(\"Option 2\");\n\t\tpicker.Items.Add(\"Option 3\");\n\n\t\tpicker.SelectedIndex = 1;\n\n\t\tAssert.Equal(1, picker.SelectedIndex);\n\t\tAssert.Equal(\"Option 2\", picker.SelectedItem);\n\t}\n\n\t[Fact]\n\tpublic void PickerSelectedItemReturnsNull()\n\t{\n\t\tvar picker = new Picker();\n\t\tpicker.Items.Add(\"Option 1\");\n\n\t\tpicker.SelectedIndex = -1;\n\n\t\tAssert.Null(picker.SelectedItem);\n\t}\n\n\t[Fact]\n\tpublic void PickerSelectedItemReturnsNullForOutOfRange()\n\t{\n\t\tvar picker = new Picker();\n\t\tpicker.Items.Add(\"Option 1\");\n\n\t\tpicker.SelectedIndex = 5; // Out of range\n\n\t\tAssert.Null(picker.SelectedItem);\n\t}\n\n\t[Fact]\n\tpublic void PickerTextColorCanBeSet()\n\t{\n\t\tvar picker = new Picker();\n\t\tpicker.TextColor = Colors.Red;\n\n\t\tAssert.Equal(Colors.Red, picker.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void PickerItemsCollectionNotifiesChange()\n\t{\n\t\tstring? property = null;\n\t\tvar picker = new Picker();\n\t\tpicker.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\t\n\t\tpicker.Items = new ObservableCollection<string> { \"New Item\" };\n\n\t\tAssert.Equal(nameof(picker.Items), property);\n\t}\n\n\t[Fact]\n\tpublic void PickerTitleCanBeSet()\n\t{\n\t\tvar picker = new Picker { Title = \"Choose one\" };\n\n\t\tAssert.Equal(\"Choose one\", picker.Title);\n\t}\n\n\t[Fact]\n\tpublic void PickerSelectedItemNotifiesPropertyChanged()\n\t{\n\t\tvar picker = new Picker();\n\t\tpicker.Items.Add(\"Option 1\");\n\t\tpicker.Items.Add(\"Option 2\");\n\n\t\tvar properties = new List<string?>();\n\t\tpicker.PropertyChanged += (sender, e) => properties.Add(e.PropertyName);\n\n\t\tpicker.SelectedIndex = 1;\n\n\t\tAssert.Contains(nameof(picker.SelectedItem), properties);\n\t\tAssert.Equal(\"Option 2\", picker.SelectedItem);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/Platforms/Android/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\t<application android:allowBackup=\"true\" android:supportsRtl=\"true\" android:theme=\"@style/Theme.Material3.Light.NoActionBar\" />\n\t<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n\t<uses-permission android:name=\"android.permission.INTERNET\" />\n</manifest>\n"
  },
  {
    "path": "tests/Spice.Tests/Platforms/Android/MainActivity.cs",
    "content": "using Android.App;\nusing Android.OS;\n\nnamespace Spice.Tests;\n\n[Activity(Label = \"Spice.Tests\", MainLauncher = true)]\npublic class MainActivity : Activity\n{\n\tprotected override void OnCreate(Bundle? savedInstanceState)\n\t{\n\t\tbase.OnCreate(savedInstanceState);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/Platforms/Android/TestDevice.cs",
    "content": "using System.Globalization;\nusing Microsoft.DotNet.XHarness.TestRunners.Common;\n\nnamespace Spice.Tests;\n\nclass TestDevice : IDevice\n{\n\tprivate readonly string _uniqueIdentifier = Guid.NewGuid().ToString(\"N\");\n\tpublic string BundleIdentifier => \"com.jonathanpeppers.spice.tests\";\n\tpublic string UniqueIdentifier => _uniqueIdentifier;\n\tpublic string Name => Android.OS.Build.Model ?? \"Unknown\";\n\tpublic string Model => Android.OS.Build.Device ?? \"Unknown\";\n\tpublic string SystemName => \"Android\";\n\tpublic string SystemVersion => Android.OS.Build.VERSION.Release ?? \"Unknown\";\n\tpublic string Locale => CultureInfo.CurrentCulture.Name;\n}\n"
  },
  {
    "path": "tests/Spice.Tests/Platforms/Android/TestEntryPoint.cs",
    "content": "using Microsoft.DotNet.XHarness.TestRunners.Common;\nusing Microsoft.DotNet.XHarness.TestRunners.Xunit;\n\nnamespace Spice.Tests;\n\nclass TestEntryPoint : AndroidApplicationEntryPoint\n{\n\treadonly string _resultsPath;\n\n\tpublic TestEntryPoint(string cacheDir)\n\t{\n\t\t_resultsPath = Path.Combine(cacheDir, \"TestResults.xml\");\n\t}\n\n\tprotected override bool LogExcludedTests => true;\n\n\tpublic override TextWriter? Logger => null;\n\n\tpublic override string TestsResultsFinalPath => _resultsPath;\n\n\tprotected override int? MaxParallelThreads => 1;\n\n\tprotected override IDevice Device { get; } = new TestDevice();\n\n\tprotected override IEnumerable<TestAssemblyInfo> GetTestAssemblies()\n\t{\n\t\tvar asm = typeof(TestEntryPoint).Assembly;\n\t\tvar path = Path.Combine(AppContext.BaseDirectory, asm.GetName().Name + \".dll\");\n\t\t// On Android, assemblies are embedded as native .so files; create a\n\t\t// placeholder so TestAssemblyInfo's file-existence check passes.\n\t\tif (!File.Exists(path))\n\t\t\tFile.Create(path).Dispose();\n\t\treturn [new TestAssemblyInfo(asm, path)];\n\t}\n\n\tprotected override void TerminateWithSuccess() { }\n}\n"
  },
  {
    "path": "tests/Spice.Tests/Platforms/Android/TestInstrumentation.cs",
    "content": "using Android.App;\nusing Android.OS;\nusing Android.Runtime;\n\nnamespace Spice.Tests;\n\n[Instrumentation(Name = \"com.jonathanpeppers.spice.tests.TestInstrumentation\")]\npublic class TestInstrumentation : Instrumentation\n{\n\tprotected TestInstrumentation(IntPtr handle, JniHandleOwnership ownership)\n\t\t: base(handle, ownership) { }\n\n\tpublic override void OnCreate(Bundle? arguments)\n\t{\n\t\tbase.OnCreate(arguments);\n\t\tStart();\n\t}\n\n\tpublic override void OnStart()\n\t{\n\t\tbase.OnStart();\n\n\t\t// Initialize Spice platform so controls can create native views.\n\t\t// Wrap with Material theme so Material components (BottomNavigationView) work.\n\t\tvar appContext = Android.App.Application.Context;\n\t\tSpice.Platform.Context = new Android.Views.ContextThemeWrapper(\n\t\t\tappContext, Resource.Style.Theme_Material3_Light_NoActionBar);\n\n\t\t// Prepare a Looper on this thread so Android views (WebView,\n\t\t// SwipeRefreshLayout, etc.) that require a Handler can be created.\n\t\tif (Looper.MyLooper() == null)\n\t\t\tLooper.Prepare();\n\n\t\tTask.Run(async () =>\n\t\t{\n\t\t\t// Also prepare a Looper on the Task.Run thread\n\t\t\tif (Looper.MyLooper() == null)\n\t\t\t\tLooper.Prepare();\n\n\t\t\tvar bundle = new Bundle();\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar entryPoint = new TestEntryPoint(\n\t\t\t\t\tAndroid.App.Application.Context.CacheDir!.AbsolutePath);\n\t\t\t\tentryPoint.TestsCompleted += (_, results) =>\n\t\t\t\t{\n\t\t\t\t\tbundle.PutLong(\"return-code\", results.FailedTests == 0 ? 0 : 1);\n\t\t\t\t\tbundle.PutString(\"test-execution-summary\",\n\t\t\t\t\t\t$\"Tests run: {results.ExecutedTests} \" +\n\t\t\t\t\t\t$\"Passed: {results.PassedTests} \" +\n\t\t\t\t\t\t$\"Failed: {results.FailedTests} \" +\n\t\t\t\t\t\t$\"Skipped: {results.SkippedTests}\");\n\t\t\t\t};\n\n\t\t\t\tawait entryPoint.RunAsync();\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tConsole.WriteLine(\"Error while running tests: \" + ex);\n\t\t\t}\n\n\t\t\tif (bundle.GetLong(\"return-code\", -1) == -1)\n\t\t\t\tbundle.PutLong(\"return-code\", 1);\n\n\t\t\tFinish(Result.Ok, bundle);\n\t\t});\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/Platforms/iOS/AppDelegate.cs",
    "content": "using Foundation;\nusing Microsoft.DotNet.XHarness.TestRunners.Common;\nusing UIKit;\n\nnamespace Spice.Tests;\n\n[Register(\"AppDelegate\")]\npublic class AppDelegate : UIApplicationDelegate\n{\n\tpublic override UIWindow? Window { get; set; }\n\n\tpublic override bool FinishedLaunching(UIApplication application, NSDictionary? launchOptions)\n\t{\n#pragma warning disable CA1422 // Validate platform compatibility (xharness simulators)\n\t\tWindow = new UIWindow(UIScreen.MainScreen.Bounds)\n\t\t{\n\t\t\tRootViewController = new UIViewController()\n\t\t};\n#pragma warning restore CA1422\n\t\tWindow.MakeKeyAndVisible();\n\n\t\t// Initialize Spice platform so controls can create native views\n\t\tSpice.Platform.Window = Window;\n\n\t\t// Run tests on main thread — UIKit views must be created/mutated on main thread\n\t\tBeginInvokeOnMainThread(async () =>\n\t\t{\n\t\t\tConsole.WriteLine(\"Spice.Tests: Starting test runner...\");\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar runner = new TestEntryPoint();\n\n\t\t\t\trunner.TestsCompleted += (_, results) =>\n\t\t\t\t{\n\t\t\t\t\tConsole.WriteLine(\n\t\t\t\t\t\t$\"Tests run: {results.ExecutedTests} \" +\n\t\t\t\t\t\t$\"Passed: {results.PassedTests} \" +\n\t\t\t\t\t\t$\"Failed: {results.FailedTests} \" +\n\t\t\t\t\t\t$\"Skipped: {results.SkippedTests}\");\n\t\t\t\t};\n\n\t\t\t\tawait runner.RunAsync();\n\t\t\t\tConsole.WriteLine(\"Spice.Tests: Test runner completed.\");\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tConsole.WriteLine(\"Error while running tests: \" + ex);\n\t\t\t}\n\t\t});\n\n\t\treturn true;\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/Platforms/iOS/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIDeviceFamily</key>\n\t<array>\n\t\t<integer>1</integer>\n\t\t<integer>2</integer>\n\t</array>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>arm64</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "tests/Spice.Tests/Platforms/iOS/Program.cs",
    "content": "using UIKit;\nusing Spice.Tests;\n\nUIApplication.Main(args, null, typeof(AppDelegate));\n"
  },
  {
    "path": "tests/Spice.Tests/Platforms/iOS/TestDevice.cs",
    "content": "using System.Globalization;\nusing Microsoft.DotNet.XHarness.TestRunners.Common;\nusing UIKit;\n\nnamespace Spice.Tests;\n\nclass TestDevice : IDevice\n{\n\tprivate readonly string _uniqueIdentifier = Guid.NewGuid().ToString(\"N\");\n\n\tpublic string BundleIdentifier => Foundation.NSBundle.MainBundle.BundleIdentifier ?? \"\";\n\tpublic string UniqueIdentifier => _uniqueIdentifier;\n\tpublic string Name => UIDevice.CurrentDevice.Name;\n\tpublic string Model => UIDevice.CurrentDevice.Model;\n\tpublic string SystemName => UIDevice.CurrentDevice.SystemName;\n\tpublic string SystemVersion => UIDevice.CurrentDevice.SystemVersion;\n\tpublic string Locale => CultureInfo.CurrentCulture.Name;\n}\n"
  },
  {
    "path": "tests/Spice.Tests/Platforms/iOS/TestEntryPoint.cs",
    "content": "using Microsoft.DotNet.XHarness.TestRunners.Common;\nusing Microsoft.DotNet.XHarness.TestRunners.Xunit;\nusing ObjCRuntime;\nusing UIKit;\n\nnamespace Spice.Tests;\n\nclass TestEntryPoint : iOSApplicationEntryPoint\n{\n\tprotected override bool LogExcludedTests => true;\n\n\tprotected override int? MaxParallelThreads => 1;\n\n\tprotected override IDevice Device { get; } = new TestDevice();\n\n\tprotected override IEnumerable<TestAssemblyInfo> GetTestAssemblies()\n\t{\n\t\tvar asm = typeof(TestEntryPoint).Assembly;\n\t\tvar path = Path.Combine(AppContext.BaseDirectory, asm.GetName().Name + \".dll\");\n\t\treturn [new TestAssemblyInfo(asm, path)];\n\t}\n\n\tprotected override void TerminateWithSuccess()\n\t{\n\t\tUIApplication.SharedApplication.BeginInvokeOnMainThread(() =>\n\t\t{\n\t\t\tvar selector = new Selector(\"terminateWithSuccess\");\n\t\t\tUIApplication.SharedApplication.PerformSelector(\n\t\t\t\tselector, UIApplication.SharedApplication, 0);\n\t\t});\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/ProgressBarTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for ProgressBar control\n/// </summary>\npublic class ProgressBarTests\n{\n\t[Fact]\n\tpublic void Constructor()\n\t{\n\t\tvar progressBar = new ProgressBar();\n\t\tAssert.NotNull(progressBar);\n\t}\n\n\t[Fact]\n\tpublic void DefaultProgress()\n\t{\n\t\tvar progressBar = new ProgressBar();\n\t\tAssert.Equal(0.0, progressBar.Progress);\n\t}\n\n\t[Fact]\n\tpublic void SetProgress()\n\t{\n\t\tvar progressBar = new ProgressBar\n\t\t{\n\t\t\tProgress = 0.5\n\t\t};\n\t\tAssert.Equal(0.5, progressBar.Progress);\n\t}\n\n\t[Fact]\n\tpublic void ProgressRange()\n\t{\n\t\tvar progressBar = new ProgressBar();\n\t\t\n\t\t// Test minimum\n\t\tprogressBar.Progress = 0.0;\n\t\tAssert.Equal(0.0, progressBar.Progress);\n\t\t\n\t\t// Test maximum\n\t\tprogressBar.Progress = 1.0;\n\t\tAssert.Equal(1.0, progressBar.Progress);\n\t\t\n\t\t// Test middle value\n\t\tprogressBar.Progress = 0.75;\n\t\tAssert.Equal(0.75, progressBar.Progress);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFires()\n\t{\n\t\tstring? property = null;\n\t\tvar progressBar = new ProgressBar();\n\t\tprogressBar.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\tprogressBar.Progress = 0.3;\n\n\t\tAssert.Equal(nameof(progressBar.Progress), property);\n\t}\n\n\t[Fact]\n\tpublic void ProgressClamping()\n\t{\n\t\tvar progressBar = new ProgressBar();\n\t\t\n\t\t// Values below 0.0 should be clamped to 0.0\n\t\tprogressBar.Progress = -0.5;\n\t\tAssert.Equal(0.0, progressBar.Progress);\n\t\t\n\t\t// Values above 1.0 should be clamped to 1.0\n\t\tprogressBar.Progress = 1.5;\n\t\tAssert.Equal(1.0, progressBar.Progress);\n\t\t\n\t\t// Values at boundaries should work correctly\n\t\tprogressBar.Progress = 0.0;\n\t\tAssert.Equal(0.0, progressBar.Progress);\n\t\t\n\t\tprogressBar.Progress = 1.0;\n\t\tAssert.Equal(1.0, progressBar.Progress);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/PropertyChangedTests.cs",
    "content": "﻿namespace Spice.Tests;\n\n/// <summary>\n/// Asserts that various events on base objects work\n/// </summary>\npublic class PropertyChangedTests\n{\n\t[Fact]\n\tpublic void PropertyChangedWorks()\n\t{\n\t\tstring? property = null;\n\t\tvar view = new View();\n\t\tview.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\tview.VerticalOptions = LayoutOptions.End;\n\n\t\tAssert.Equal(nameof(view.VerticalOptions), property);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangingWorks()\n\t{\n\t\tstring? property = null;\n\t\tvar view = new View();\n\t\tview.PropertyChanging += (sender, e) => property = e.PropertyName;\n\t\tview.HorizontalOptions = LayoutOptions.End;\n\n\t\tAssert.Equal(nameof(view.HorizontalOptions), property);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/RadioButtonTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for RadioButton control\n/// </summary>\npublic class RadioButtonTests\n{\n\t[Fact]\n\tpublic void IsCheckedPropertyChanged()\n\t{\n\t\tstring? property = null;\n\t\tvar radioButton = new RadioButton();\n\t\tradioButton.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\tradioButton.IsChecked = true;\n\n\t\tAssert.Equal(nameof(radioButton.IsChecked), property);\n\t\tAssert.True(radioButton.IsChecked);\n\t}\n\n\t[Fact]\n\tpublic void CheckedChangedAssignmentRaisesPropertyChanged()\n\t{\n\t\tstring? property = null;\n\t\tvar radioButton = new RadioButton();\n\t\tradioButton.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\tradioButton.CheckedChanged = _ => { };\n\n\t\tAssert.Equal(nameof(radioButton.CheckedChanged), property);\n\t\tAssert.NotNull(radioButton.CheckedChanged);\n\t}\n\n\t[Fact]\n\tpublic void DefaultIsCheckedIsFalse()\n\t{\n\t\tvar radioButton = new RadioButton();\n\t\tAssert.False(radioButton.IsChecked);\n\t}\n\n\t[Fact]\n\tpublic void IsCheckedCanBeSet()\n\t{\n\t\tvar radioButton = new RadioButton { IsChecked = true };\n\t\tAssert.True(radioButton.IsChecked);\n\n\t\tradioButton.IsChecked = false;\n\t\tAssert.False(radioButton.IsChecked);\n\t}\n\n\t[Fact]\n\tpublic void CheckedChangedCanBeSet()\n\t{\n\t\tbool invoked = false;\n\t\tvar radioButton = new RadioButton { CheckedChanged = _ => invoked = true };\n\t\t\n\t\tAssert.NotNull(radioButton.CheckedChanged);\n\t\tradioButton.CheckedChanged?.Invoke(radioButton);\n\t\tAssert.True(invoked);\n\t}\n\n\t[Fact]\n\tpublic void GroupNamePropertyChanged()\n\t{\n\t\tstring? property = null;\n\t\tvar radioButton = new RadioButton();\n\t\tradioButton.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\tradioButton.GroupName = \"TestGroup\";\n\n\t\tAssert.Equal(nameof(radioButton.GroupName), property);\n\t\tAssert.Equal(\"TestGroup\", radioButton.GroupName);\n\t}\n\n\t[Fact]\n\tpublic void GroupNameCanBeSet()\n\t{\n\t\tvar radioButton = new RadioButton { GroupName = \"Options\" };\n\t\tAssert.Equal(\"Options\", radioButton.GroupName);\n\n\t\tradioButton.GroupName = \"NewOptions\";\n\t\tAssert.Equal(\"NewOptions\", radioButton.GroupName);\n\t}\n\n\t[Fact]\n\tpublic void ContentPropertyChanged()\n\t{\n\t\tstring? property = null;\n\t\tvar radioButton = new RadioButton();\n\t\tradioButton.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\tradioButton.Content = \"Option 1\";\n\n\t\tAssert.Equal(nameof(radioButton.Content), property);\n\t\tAssert.Equal(\"Option 1\", radioButton.Content);\n\t}\n\n\t[Fact]\n\tpublic void ContentCanBeSet()\n\t{\n\t\tvar radioButton = new RadioButton { Content = \"Test Option\" };\n\t\tAssert.Equal(\"Test Option\", radioButton.Content);\n\n\t\tradioButton.Content = \"Updated Option\";\n\t\tAssert.Equal(\"Updated Option\", radioButton.Content);\n\t}\n\n\t[Fact]\n\tpublic void GroupExclusivity()\n\t{\n\t\tvar radioButton1 = new RadioButton { GroupName = \"Group1\" };\n\t\tvar radioButton2 = new RadioButton { GroupName = \"Group1\" };\n\t\tvar radioButton3 = new RadioButton { GroupName = \"Group1\" };\n\n\t\tradioButton1.IsChecked = true;\n\t\tAssert.True(radioButton1.IsChecked);\n\t\tAssert.False(radioButton2.IsChecked);\n\t\tAssert.False(radioButton3.IsChecked);\n\n\t\tradioButton2.IsChecked = true;\n\t\tAssert.False(radioButton1.IsChecked);\n\t\tAssert.True(radioButton2.IsChecked);\n\t\tAssert.False(radioButton3.IsChecked);\n\n\t\tradioButton3.IsChecked = true;\n\t\tAssert.False(radioButton1.IsChecked);\n\t\tAssert.False(radioButton2.IsChecked);\n\t\tAssert.True(radioButton3.IsChecked);\n\n\t\t// Prevent aggressive GC from collecting Java peers during group operations\n\t\tGC.KeepAlive(radioButton1);\n\t\tGC.KeepAlive(radioButton2);\n\t\tGC.KeepAlive(radioButton3);\n\t}\n\n\t[Fact]\n\tpublic void DifferentGroupsAreIndependent()\n\t{\n\t\tvar radioButton1 = new RadioButton { GroupName = \"Group1\" };\n\t\tvar radioButton2 = new RadioButton { GroupName = \"Group2\" };\n\n\t\tradioButton1.IsChecked = true;\n\t\tradioButton2.IsChecked = true;\n\n\t\tAssert.True(radioButton1.IsChecked);\n\t\tAssert.True(radioButton2.IsChecked);\n\t}\n\n\t[Fact]\n\tpublic void NoGroupNameAllowsMultipleChecked()\n\t{\n\t\tvar radioButton1 = new RadioButton();\n\t\tvar radioButton2 = new RadioButton();\n\n\t\tradioButton1.IsChecked = true;\n\t\tradioButton2.IsChecked = true;\n\n\t\tAssert.True(radioButton1.IsChecked);\n\t\tAssert.True(radioButton2.IsChecked);\n\t}\n\n\t[Fact]\n\tpublic void ObjectInitializerWithIsCheckedBeforeGroupName()\n\t{\n\t\t// Bug fix: IsChecked set before GroupName should still enforce group exclusivity\n\t\tvar radioButton1 = new RadioButton { IsChecked = true, GroupName = \"Options\" };\n\t\tvar radioButton2 = new RadioButton { GroupName = \"Options\" };\n\n\t\tAssert.True(radioButton1.IsChecked);\n\t\tAssert.False(radioButton2.IsChecked);\n\n\t\tradioButton2.IsChecked = true;\n\t\tAssert.False(radioButton1.IsChecked);\n\t\tAssert.True(radioButton2.IsChecked);\n\t}\n\n\t[Fact]\n\tpublic void ChangingGroupNameRemovesFromOldGroup()\n\t{\n\t\tvar radioButton1 = new RadioButton { GroupName = \"GroupA\", IsChecked = true };\n\t\tvar radioButton2 = new RadioButton { GroupName = \"GroupA\" };\n\n\t\tAssert.True(radioButton1.IsChecked);\n\t\tAssert.False(radioButton2.IsChecked);\n\n\t\t// Change radioButton1 to GroupB\n\t\tradioButton1.GroupName = \"GroupB\";\n\n\t\t// Checking radioButton2 in GroupA should not affect radioButton1 anymore\n\t\tradioButton2.IsChecked = true;\n\t\tAssert.True(radioButton1.IsChecked); // Still checked, now in different group\n\t\tAssert.True(radioButton2.IsChecked);\n\t}\n\n\t[Fact]\n\tpublic void ChangingGroupNameToSameGroupEnforcesExclusivity()\n\t{\n\t\tvar radioButton1 = new RadioButton { GroupName = \"GroupA\", IsChecked = true };\n\t\tvar radioButton2 = new RadioButton { GroupName = \"GroupB\", IsChecked = true };\n\n\t\tAssert.True(radioButton1.IsChecked);\n\t\tAssert.True(radioButton2.IsChecked);\n\n\t\t// Move radioButton2 to GroupA - should uncheck radioButton1\n\t\tradioButton2.GroupName = \"GroupA\";\n\n\t\tAssert.False(radioButton1.IsChecked);\n\t\tAssert.True(radioButton2.IsChecked);\n\t}\n\n}\n"
  },
  {
    "path": "tests/Spice.Tests/RefreshViewTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for RefreshView functionality\n/// </summary>\npublic class RefreshViewTests\n{\n\t[Fact]\n\tpublic void CanCreate()\n\t{\n\t\tvar refreshView = new RefreshView();\n\t\tAssert.NotNull(refreshView);\n\t}\n\n\t[Fact]\n\tpublic void ContentIsNullByDefault()\n\t{\n\t\tvar refreshView = new RefreshView();\n\t\tAssert.Null(refreshView.Content);\n\t}\n\n\t[Fact]\n\tpublic void IsRefreshingIsFalseByDefault()\n\t{\n\t\tvar refreshView = new RefreshView();\n\t\tAssert.False(refreshView.IsRefreshing);\n\t}\n\n\t[Fact]\n\tpublic void CommandIsNullByDefault()\n\t{\n\t\tvar refreshView = new RefreshView();\n\t\tAssert.Null(refreshView.Command);\n\t}\n\n\t[Fact]\n\tpublic void RefreshColorIsNullByDefault()\n\t{\n\t\tvar refreshView = new RefreshView();\n\t\tAssert.Null(refreshView.RefreshColor);\n\t}\n\n\t[Fact]\n\tpublic void CanSetContent()\n\t{\n\t\tvar refreshView = new RefreshView();\n\t\tvar scrollView = new ScrollView();\n\t\t\n\t\trefreshView.Content = scrollView;\n\t\t\n\t\tAssert.NotNull(refreshView.Content);\n\t\tAssert.Equal(scrollView, refreshView.Content);\n\t}\n\n\t[Fact]\n\tpublic void CanReplaceContent()\n\t{\n\t\tvar refreshView = new RefreshView();\n\t\tvar firstScroll = new ScrollView();\n\t\tvar secondScroll = new ScrollView();\n\n\t\trefreshView.Content = firstScroll;\n\t\tAssert.Equal(firstScroll, refreshView.Content);\n\n\t\trefreshView.Content = secondScroll;\n\t\tAssert.Equal(secondScroll, refreshView.Content);\n\t}\n\n\t[Fact]\n\tpublic void CanClearContent()\n\t{\n\t\tvar refreshView = new RefreshView();\n\t\tvar scrollView = new ScrollView();\n\t\t\n\t\trefreshView.Content = scrollView;\n\t\tAssert.NotNull(refreshView.Content);\n\n\t\trefreshView.Content = null;\n\t\tAssert.Null(refreshView.Content);\n\t}\n\n\t[Fact]\n\tpublic void CanSetIsRefreshing()\n\t{\n\t\tvar refreshView = new RefreshView();\n\t\tAssert.False(refreshView.IsRefreshing);\n\n\t\trefreshView.IsRefreshing = true;\n\t\tAssert.True(refreshView.IsRefreshing);\n\n\t\trefreshView.IsRefreshing = false;\n\t\tAssert.False(refreshView.IsRefreshing);\n\t}\n\n\t[Fact]\n\tpublic void CanSetCommand()\n\t{\n\t\tvar refreshView = new RefreshView();\n\t\tvar commandExecuted = false;\n\t\tAction command = () => commandExecuted = true;\n\n\t\trefreshView.Command = command;\n\t\tAssert.NotNull(refreshView.Command);\n\t\tAssert.Equal(command, refreshView.Command);\n\n\t\t// Execute the command\n\t\trefreshView.Command.Invoke();\n\t\tAssert.True(commandExecuted);\n\t}\n\n\t[Fact]\n\tpublic void CanSetRefreshColor()\n\t{\n\t\tvar refreshView = new RefreshView();\n\t\tAssert.Null(refreshView.RefreshColor);\n\n\t\tvar blue = new Color(0, 0, 255);\n\t\trefreshView.RefreshColor = blue;\n\t\tAssert.Equal(blue, refreshView.RefreshColor);\n\n\t\tvar red = new Color(255, 0, 0);\n\t\trefreshView.RefreshColor = red;\n\t\tAssert.Equal(red, refreshView.RefreshColor);\n\n\t\trefreshView.RefreshColor = null;\n\t\tAssert.Null(refreshView.RefreshColor);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnContentChange()\n\t{\n\t\tstring? property = null;\n\t\tvar refreshView = new RefreshView();\n\t\trefreshView.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\t\n\t\tvar scrollView = new ScrollView();\n\t\trefreshView.Content = scrollView;\n\n\t\tAssert.Equal(nameof(refreshView.Content), property);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnIsRefreshingChange()\n\t{\n\t\tstring? property = null;\n\t\tvar refreshView = new RefreshView();\n\t\trefreshView.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\t\n\t\trefreshView.IsRefreshing = true;\n\n\t\tAssert.Equal(nameof(refreshView.IsRefreshing), property);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnCommandChange()\n\t{\n\t\tstring? property = null;\n\t\tvar refreshView = new RefreshView();\n\t\trefreshView.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\t\n\t\t// Set command to test property change notification\n\t\trefreshView.Command = () => { };\n\n\t\tAssert.Equal(nameof(refreshView.Command), property);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnRefreshColorChange()\n\t{\n\t\tstring? property = null;\n\t\tvar refreshView = new RefreshView();\n\t\trefreshView.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\t\n\t\trefreshView.RefreshColor = new Color(255, 0, 0);\n\n\t\tAssert.Equal(nameof(refreshView.RefreshColor), property);\n\t}\n\n\t[Fact]\n\tpublic void SettingSameContentDoesNotFirePropertyChanged()\n\t{\n\t\tvar refreshView = new RefreshView();\n\t\tvar scrollView = new ScrollView();\n\t\trefreshView.Content = scrollView;\n\n\t\tint propertyChangedCount = 0;\n\t\trefreshView.PropertyChanged += (sender, e) => propertyChangedCount++;\n\n\t\trefreshView.Content = scrollView;\n\t\tAssert.Equal(0, propertyChangedCount);\n\t}\n\n\t[Fact]\n\tpublic void CanContainScrollView()\n\t{\n\t\tvar refreshView = new RefreshView();\n\t\tvar scrollView = new ScrollView();\n\t\tvar label = new Label { Text = \"Pull to refresh\" };\n\t\tscrollView.Add(label);\n\t\t\n\t\trefreshView.Content = scrollView;\n\t\t\n\t\tAssert.NotNull(refreshView.Content);\n\t\tAssert.Equal(scrollView, refreshView.Content);\n\t\tAssert.Single(scrollView.Children);\n\t}\n\n\t[Fact]\n\tpublic void CanContainStackLayout()\n\t{\n\t\tvar refreshView = new RefreshView();\n\t\tvar stackLayout = new StackLayout\n\t\t{\n\t\t\tnew Label { Text = \"Item 1\" },\n\t\t\tnew Label { Text = \"Item 2\" },\n\t\t\tnew Label { Text = \"Item 3\" }\n\t\t};\n\t\t\n\t\trefreshView.Content = stackLayout;\n\t\t\n\t\tAssert.NotNull(refreshView.Content);\n\t\tAssert.Equal(stackLayout, refreshView.Content);\n\t\tAssert.Equal(3, stackLayout.Children.Count);\n\t}\n\n\t[Fact]\n\tpublic void CanSetAllPropertiesAtOnce()\n\t{\n\t\tvar commandExecuted = false;\n\t\tvar blue = new Color(0, 0, 255);\n\t\tvar refreshView = new RefreshView\n\t\t{\n\t\t\tContent = new ScrollView(),\n\t\t\tIsRefreshing = true,\n\t\t\tCommand = () => commandExecuted = true,\n\t\t\tRefreshColor = blue\n\t\t};\n\n\t\tAssert.NotNull(refreshView.Content);\n\t\tAssert.True(refreshView.IsRefreshing);\n\t\tAssert.NotNull(refreshView.Command);\n\t\tAssert.Equal(blue, refreshView.RefreshColor);\n\n\t\trefreshView.Command.Invoke();\n\t\tAssert.True(commandExecuted);\n\t}\n\n\t[Fact]\n\tpublic void RefreshViewCanBeNestedInOtherViews()\n\t{\n\t\tvar outerStack = new StackLayout();\n\t\tvar refreshView = new RefreshView\n\t\t{\n\t\t\tContent = new ScrollView()\n\t\t};\n\t\t\n\t\touterStack.Add(refreshView);\n\t\t\n\t\tAssert.Single(outerStack.Children);\n\t\tAssert.Equal(refreshView, outerStack.Children[0]);\n\t\tAssert.NotNull(refreshView.Content);\n\t}\n\n\t[Fact]\n\tpublic void MultipleRefreshViewsCanExist()\n\t{\n\t\tvar refreshView1 = new RefreshView { Content = new ScrollView() };\n\t\tvar refreshView2 = new RefreshView { Content = new ScrollView() };\n\t\tvar refreshView3 = new RefreshView { Content = new ScrollView() };\n\n\t\tvar stackLayout = new StackLayout\n\t\t{\n\t\t\trefreshView1,\n\t\t\trefreshView2,\n\t\t\trefreshView3\n\t\t};\n\n\t\tAssert.Equal(3, stackLayout.Children.Count);\n\t\tAssert.NotNull(refreshView1.Content);\n\t\tAssert.NotNull(refreshView2.Content);\n\t\tAssert.NotNull(refreshView3.Content);\n\t}\n\n\t[Fact]\n\tpublic void DefaultPaddingIsZero()\n\t{\n\t\tvar refreshView = new RefreshView();\n\t\tAssert.Equal(0.0, refreshView.Padding);\n\t}\n\n\t[Fact]\n\tpublic void CanSetPadding()\n\t{\n\t\tvar refreshView = new RefreshView\n\t\t{\n\t\t\tPadding = 16.0\n\t\t};\n\t\tAssert.Equal(16.0, refreshView.Padding);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnPaddingChange()\n\t{\n\t\tstring? property = null;\n\t\tvar refreshView = new RefreshView();\n\t\trefreshView.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\t\n\t\trefreshView.Padding = 18.0;\n\n\t\tAssert.Equal(nameof(refreshView.Padding), property);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/ScrollViewTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for ScrollView functionality\n/// </summary>\npublic class ScrollViewTests\n{\n\t[Fact]\n\tpublic void CanCreate()\n\t{\n\t\tvar scrollView = new ScrollView();\n\t\tAssert.NotNull(scrollView);\n\t}\n\n\t[Fact]\n\tpublic void DefaultOrientationIsVertical()\n\t{\n\t\tvar scrollView = new ScrollView();\n\t\tAssert.Equal(Orientation.Vertical, scrollView.Orientation);\n\t}\n\n\t[Fact]\n\tpublic void CanSetOrientation()\n\t{\n\t\tif (OperatingSystem.IsAndroid())\n\t\t\treturn; // Android ScrollView doesn't support changing orientation after construction\n\t\tvar scrollView = new ScrollView\n\t\t{\n\t\t\tOrientation = Orientation.Horizontal\n\t\t};\n\t\tAssert.Equal(Orientation.Horizontal, scrollView.Orientation);\n\t}\n\n\t[Fact]\n\tpublic void CanAddChild()\n\t{\n\t\tvar scrollView = new ScrollView();\n\t\tvar label = new Label { Text = \"Test\" };\n\t\tscrollView.Add(label);\n\t\t\n\t\tAssert.Single(scrollView.Children);\n\t\tAssert.Equal(label, scrollView.Children[0]);\n\t}\n\n\t[Fact]\n\tpublic void AddingMultipleChildrenTracksAll()\n\t{\n\t\tif (OperatingSystem.IsAndroid())\n\t\t\treturn; // Android ScrollView can host only one direct child\n\t\tvar scrollView = new ScrollView();\n\t\tvar first = new Label { Text = \"First\" };\n\t\tvar second = new Label { Text = \"Second\" };\n\n\t\tscrollView.Add(first);\n\t\tscrollView.Add(second);\n\n\t\tAssert.Equal(2, scrollView.Children.Count);\n\t\tAssert.Equal(first, scrollView.Children[0]);\n\t\tAssert.Equal(second, scrollView.Children[1]);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnOrientationChange()\n\t{\n\t\tif (OperatingSystem.IsAndroid())\n\t\t\treturn; // Android ScrollView doesn't support changing orientation after construction\n\t\tstring? property = null;\n\t\tvar scrollView = new ScrollView();\n\t\tscrollView.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\tscrollView.Orientation = Orientation.Horizontal;\n\n\t\tAssert.Equal(nameof(scrollView.Orientation), property);\n\t}\n\n\t[Fact]\n\tpublic void CanContainStackLayout()\n\t{\n\t\tvar scrollView = new ScrollView();\n\t\tvar stackLayout = new StackLayout\n\t\t{\n\t\t\tnew Label { Text = \"Item 1\" },\n\t\t\tnew Label { Text = \"Item 2\" },\n\t\t\tnew Label { Text = \"Item 3\" }\n\t\t};\n\t\tscrollView.Add(stackLayout);\n\t\t\n\t\tAssert.Single(scrollView.Children);\n\t\tAssert.Equal(stackLayout, scrollView.Children[0]);\n\t\tAssert.Equal(3, stackLayout.Children.Count);\n\t}\n\n\t[Fact]\n\tpublic void DefaultPaddingIsZero()\n\t{\n\t\tvar scrollView = new ScrollView();\n\t\tAssert.Equal(0.0, scrollView.Padding);\n\t}\n\n\t[Fact]\n\tpublic void CanSetPadding()\n\t{\n\t\tvar scrollView = new ScrollView\n\t\t{\n\t\t\tPadding = 12.0\n\t\t};\n\t\tAssert.Equal(12.0, scrollView.Padding);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnPaddingChange()\n\t{\n\t\tstring? property = null;\n\t\tvar scrollView = new ScrollView();\n\t\tscrollView.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\t\n\t\tscrollView.Padding = 20.0;\n\n\t\tAssert.Equal(nameof(scrollView.Padding), property);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/SearchBarTests.cs",
    "content": "namespace Spice.Tests;\n\npublic class SearchBarTests\n{\n\t[Fact]\n\tpublic void Text_DefaultsToEmpty()\n\t{\n\t\tvar searchBar = new SearchBar();\n\t\tAssert.Equal(\"\", searchBar.Text);\n\t}\n\n\t[Fact]\n\tpublic void Placeholder_DefaultsToNull()\n\t{\n\t\tvar searchBar = new SearchBar();\n\t\tAssert.Null(searchBar.Placeholder);\n\t}\n\n\t[Fact]\n\tpublic void TextColor_DefaultsToNull()\n\t{\n\t\tvar searchBar = new SearchBar();\n\t\tAssert.Null(searchBar.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void SearchButtonPressed_DefaultsToNull()\n\t{\n\t\tvar searchBar = new SearchBar();\n\t\tAssert.Null(searchBar.SearchButtonPressed);\n\t}\n\n\t[Fact]\n\tpublic void PlaceholderColor_DefaultsToNull()\n\t{\n\t\tvar searchBar = new SearchBar();\n\t\tAssert.Null(searchBar.PlaceholderColor);\n\t}\n\n\t[Fact]\n\tpublic void TextChanged_DefaultsToNull()\n\t{\n\t\tvar searchBar = new SearchBar();\n\t\tAssert.Null(searchBar.TextChanged);\n\t}\n\n\t[Fact]\n\tpublic void Text_CanBeSet()\n\t{\n\t\tvar searchBar = new SearchBar();\n\t\tsearchBar.Text = \"hello\";\n\t\tAssert.Equal(\"hello\", searchBar.Text);\n\t}\n\n\t[Fact]\n\tpublic void Placeholder_CanBeSet()\n\t{\n\t\tvar searchBar = new SearchBar();\n\t\tsearchBar.Placeholder = \"Search...\";\n\t\tAssert.Equal(\"Search...\", searchBar.Placeholder);\n\t}\n\n\t[Fact]\n\tpublic void TextColor_CanBeSet()\n\t{\n\t\tvar searchBar = new SearchBar();\n\t\tsearchBar.TextColor = Colors.Red;\n\t\tAssert.Equal(Colors.Red, searchBar.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void SearchButtonPressed_CanBeSet()\n\t{\n\t\tvar searchBar = new SearchBar();\n\t\tbool pressed = false;\n\t\tsearchBar.SearchButtonPressed = _ => pressed = true;\n\t\tsearchBar.SearchButtonPressed.Invoke(searchBar);\n\t\tAssert.True(pressed);\n\t}\n\n\t[Fact]\n\tpublic void PlaceholderColor_CanBeSet()\n\t{\n\t\tvar searchBar = new SearchBar();\n\t\tsearchBar.PlaceholderColor = Colors.Gray;\n\t\tAssert.Equal(Colors.Gray, searchBar.PlaceholderColor);\n\t}\n\n\t[Fact]\n\tpublic void TextChanged_CanBeSet()\n\t{\n\t\tvar searchBar = new SearchBar();\n\t\tbool changed = false;\n\t\tsearchBar.TextChanged = _ => changed = true;\n\t\tsearchBar.TextChanged.Invoke(searchBar);\n\t\tAssert.True(changed);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChanged_Text()\n\t{\n\t\tstring? property = null;\n\t\tvar searchBar = new SearchBar();\n\t\tsearchBar.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\tsearchBar.Text = \"test\";\n\t\tAssert.Equal(nameof(SearchBar.Text), property);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChanged_Placeholder()\n\t{\n\t\tstring? property = null;\n\t\tvar searchBar = new SearchBar();\n\t\tsearchBar.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\tsearchBar.Placeholder = \"Search...\";\n\t\tAssert.Equal(nameof(SearchBar.Placeholder), property);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChanged_TextColor()\n\t{\n\t\tstring? property = null;\n\t\tvar searchBar = new SearchBar();\n\t\tsearchBar.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\tsearchBar.TextColor = Colors.Blue;\n\t\tAssert.Equal(nameof(SearchBar.TextColor), property);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChanged_SearchButtonPressed()\n\t{\n\t\tstring? property = null;\n\t\tvar searchBar = new SearchBar();\n\t\tsearchBar.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\tsearchBar.SearchButtonPressed = _ => { };\n\t\tAssert.Equal(nameof(SearchBar.SearchButtonPressed), property);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChanged_PlaceholderColor()\n\t{\n\t\tstring? property = null;\n\t\tvar searchBar = new SearchBar();\n\t\tsearchBar.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\tsearchBar.PlaceholderColor = Colors.Gray;\n\t\tAssert.Equal(nameof(SearchBar.PlaceholderColor), property);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChanged_TextChanged()\n\t{\n\t\tstring? property = null;\n\t\tvar searchBar = new SearchBar();\n\t\tsearchBar.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\tsearchBar.TextChanged = _ => { };\n\t\tAssert.Equal(nameof(SearchBar.TextChanged), property);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/SliderTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for the Slider control\n/// </summary>\npublic class SliderTests\n{\n\t[Fact]\n\tpublic void DefaultValues()\n\t{\n\t\tvar slider = new Slider();\n\t\tAssert.Equal(0, slider.Minimum);\n\t\tAssert.Equal(1, slider.Maximum);\n\t\tAssert.Equal(0, slider.Value);\n\t\tAssert.Null(slider.ValueChanged);\n\t}\n\n\t[Fact]\n\tpublic void SetMinimum()\n\t{\n\t\tvar slider = new Slider();\n\t\tslider.Minimum = 10;\n\t\tAssert.Equal(10, slider.Minimum);\n\t}\n\n\t[Fact]\n\tpublic void SetMaximum()\n\t{\n\t\tvar slider = new Slider();\n\t\tslider.Maximum = 100;\n\t\tAssert.Equal(100, slider.Maximum);\n\t}\n\n\t[Fact]\n\tpublic void SetValue()\n\t{\n\t\tvar slider = new Slider();\n\t\tslider.Value = 0.5;\n\t\tAssert.Equal(0.5, slider.Value);\n\t}\n\n\t[Fact]\n\tpublic void SetValueWithRange()\n\t{\n\t\tvar slider = new Slider\n\t\t{\n\t\t\tMinimum = 0,\n\t\t\tMaximum = 100,\n\t\t\tValue = 50\n\t\t};\n\t\tAssert.Equal(0, slider.Minimum);\n\t\tAssert.Equal(100, slider.Maximum);\n\t\tAssert.Equal(50, slider.Value);\n\t}\n\n\t[Fact]\n\tpublic void ValueChangedEvent()\n\t{\n\t\tvar slider = new Slider();\n\t\tSlider? changedSlider = null;\n\t\tslider.ValueChanged = s => changedSlider = s;\n\t\tAssert.NotNull(slider.ValueChanged);\n\t\tslider.ValueChanged.Invoke(slider);\n\t\tAssert.Same(slider, changedSlider);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFires()\n\t{\n\t\tvar slider = new Slider();\n\t\tstring? propertyName = null;\n\t\tslider.PropertyChanged += (sender, e) => propertyName = e.PropertyName;\n\n\t\tslider.Value = 0.7;\n\t\tAssert.Equal(nameof(slider.Value), propertyName);\n\n\t\tpropertyName = null;\n\t\tslider.Minimum = 5;\n\t\tAssert.Equal(nameof(slider.Minimum), propertyName);\n\n\t\tpropertyName = null;\n\t\tslider.Maximum = 95;\n\t\tAssert.Equal(nameof(slider.Maximum), propertyName);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/Spice.Tests.csproj",
    "content": "<Project>\n\n  <Import Project=\"../../src/Spice/MSBuild/Spice.props\" />\n  <Import Sdk=\"Microsoft.NET.Sdk\" Project=\"Sdk.props\" />\n\n  <PropertyGroup>\n    <TargetFramework Condition=\" '$(RuntimeIdentifier)' != '' and $(RuntimeIdentifier.StartsWith(`android-`)) \">net10.0-android</TargetFramework>\n    <TargetFramework Condition=\" '$(RuntimeIdentifier)' != '' and ($(RuntimeIdentifier.StartsWith(`iossimulator-`)) or $(RuntimeIdentifier.StartsWith(`ios-`))) \">net10.0-ios</TargetFramework>\n    <TargetFramework Condition=\" '$(TargetFramework)' == '' \">net10.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n    <SingleProject>true</SingleProject>\n\n    <!-- net10.0 is a plain test library; mobile TFMs are Exe (test apps) -->\n    <OutputType Condition=\" '$(TargetFramework)' != 'net10.0' \">Exe</OutputType>\n\n    <ApplicationTitle>Spice.Tests</ApplicationTitle>\n    <ApplicationId>com.jonathanpeppers.spice.tests</ApplicationId>\n    <ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>\n    <ApplicationVersion>1</ApplicationVersion>\n\n    <SupportedOSPlatformVersion Condition=\"$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'\">16.0</SupportedOSPlatformVersion>\n    <SupportedOSPlatformVersion Condition=\"$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'\">21.0</SupportedOSPlatformVersion>\n\n    <!-- xUnit/xharness packages are not trimmer-compatible -->\n    <TrimMode>partial</TrimMode>\n    <SuppressTrimAnalysisWarnings>true</SuppressTrimAnalysisWarnings>\n\n    <!-- Disable AOT on iOS — simulator supports JIT natively.\n         Use SdkOnly linking to keep xUnit assemblies intact. -->\n    <RunAOTCompilation Condition=\"$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'\">false</RunAOTCompilation>\n    <MtouchLink Condition=\"$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'\">SdkOnly</MtouchLink>\n\n    <!-- Android: disable AOT so xUnit's reflection-based test discovery works.\n         Assembly store remains enabled (default); xUnit loads via Assembly.Load(). -->\n    <RunAOTCompilation Condition=\"$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'\">false</RunAOTCompilation>\n  </PropertyGroup>\n\n  <!-- Desktop test runner packages (net10.0 only) -->\n  <ItemGroup Condition=\" '$(TargetFramework)' == 'net10.0' \">\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"18.0.1\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" Version=\"3.1.5\">\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n      <PrivateAssets>all</PrivateAssets>\n    </PackageReference>\n    <PackageReference Include=\"coverlet.collector\" Version=\"6.0.4\">\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n      <PrivateAssets>all</PrivateAssets>\n    </PackageReference>\n  </ItemGroup>\n\n  <!-- Shared test framework -->\n  <ItemGroup>\n    <PackageReference Include=\"xunit\" Version=\"2.9.3\" />\n  </ItemGroup>\n\n  <!-- XHarness test runners for device tests -->\n  <ItemGroup Condition=\" '$(TargetFramework)' != 'net10.0' \">\n    <PackageReference Include=\"xunit.runner.utility\" Version=\"2.9.3\" />\n    <PackageReference Include=\"Microsoft.DotNet.XHarness.TestRunners.Xunit\" Version=\"11.0.0-prerelease.26114.1\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\Spice\\Spice.csproj\" />\n  </ItemGroup>\n\n  <Import Sdk=\"Microsoft.NET.Sdk\" Project=\"Sdk.targets\" />\n  <Import Project=\"../../src/Spice/MSBuild/Spice.targets\" />\n\n</Project>\n"
  },
  {
    "path": "tests/Spice.Tests/StackLayoutTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for StackLayout functionality\n/// </summary>\npublic class StackLayoutTests\n{\n[Fact]\npublic void CanCreate()\n{\nvar stackLayout = new StackLayout();\nAssert.NotNull(stackLayout);\n}\n\n[Fact]\npublic void StackLayoutInheritsFromView()\n{\nvar stackLayout = new StackLayout();\nAssert.IsAssignableFrom<View>(stackLayout);\n}\n\n[Fact]\npublic void DefaultOrientationIsVertical()\n{\nvar stackLayout = new StackLayout();\nAssert.Equal(Orientation.Vertical, stackLayout.Orientation);\n}\n\n[Fact]\npublic void DefaultSpacingIsZero()\n{\nvar stackLayout = new StackLayout();\nAssert.Equal(0.0, stackLayout.Spacing);\n}\n\n[Fact]\npublic void CanSetOrientation()\n{\nvar stackLayout = new StackLayout\n{\nOrientation = Orientation.Horizontal\n};\nAssert.Equal(Orientation.Horizontal, stackLayout.Orientation);\n}\n\n[Fact]\npublic void CanSetSpacing()\n{\nvar stackLayout = new StackLayout\n{\nSpacing = 10.0\n};\nAssert.Equal(10.0, stackLayout.Spacing);\n}\n\n[Fact]\npublic void DefaultPaddingIsZero()\n{\nvar stackLayout = new StackLayout();\nAssert.Equal(0.0, stackLayout.Padding);\n}\n\n[Fact]\npublic void CanSetPadding()\n{\nvar stackLayout = new StackLayout\n{\nPadding = 8.0\n};\nAssert.Equal(8.0, stackLayout.Padding);\n}\n\n[Fact]\npublic void PropertyChangedFiresOnPaddingChange()\n{\nstring? property = null;\nvar stackLayout = new StackLayout();\nstackLayout.PropertyChanged += (sender, e) => property = e.PropertyName;\n\nstackLayout.Padding = 12.0;\n\nAssert.Equal(nameof(stackLayout.Padding), property);\n}\n\n[Fact]\npublic void CanAddChildren()\n{\nvar stackLayout = new StackLayout();\nvar label1 = new Label { Text = \"First\" };\nvar label2 = new Label { Text = \"Second\" };\n\nstackLayout.Add(label1);\nstackLayout.Add(label2);\n\nAssert.Equal(2, stackLayout.Children.Count);\nAssert.Equal(label1, stackLayout.Children[0]);\nAssert.Equal(label2, stackLayout.Children[1]);\n}\n\n[Fact]\npublic void CanRemoveChildren()\n{\nvar stackLayout = new StackLayout();\nvar label = new Label { Text = \"Test\" };\n\nstackLayout.Children.Add(label);\nAssert.Single(stackLayout.Children);\n\nstackLayout.Children.Remove(label);\nAssert.Empty(stackLayout.Children);\n}\n\n[Fact]\npublic void CanClearChildren()\n{\nvar stackLayout = new StackLayout();\nstackLayout.Children.Add(new Label { Text = \"Label 1\" });\nstackLayout.Children.Add(new Label { Text = \"Label 2\" });\n\nAssert.Equal(2, stackLayout.Children.Count);\n\nstackLayout.Children.Clear();\nAssert.Empty(stackLayout.Children);\n}\n\n[Fact]\npublic void PropertyChangedFiresOnOrientationChange()\n{\nstring? property = null;\nvar stackLayout = new StackLayout();\nstackLayout.PropertyChanged += (sender, e) => property = e.PropertyName;\n\nstackLayout.Orientation = Orientation.Horizontal;\n\nAssert.Equal(nameof(stackLayout.Orientation), property);\n}\n\n[Fact]\npublic void PropertyChangedFiresOnSpacingChange()\n{\nstring? property = null;\nvar stackLayout = new StackLayout();\nstackLayout.PropertyChanged += (sender, e) => property = e.PropertyName;\n\nstackLayout.Spacing = 5.0;\n\nAssert.Equal(nameof(stackLayout.Spacing), property);\n}\n\n[Fact]\npublic void CanSetAllPropertiesAtOnce()\n{\nvar stackLayout = new StackLayout\n{\nOrientation = Orientation.Horizontal,\nSpacing = 15.0\n};\n\nAssert.Equal(Orientation.Horizontal, stackLayout.Orientation);\nAssert.Equal(15.0, stackLayout.Spacing);\n}\n\n[Fact]\npublic void NegativeSpacingIsAllowed()\n{\nvar stackLayout = new StackLayout { Spacing = -5.0 };\nAssert.Equal(-5.0, stackLayout.Spacing);\n}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/SwipeItemsTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for the default behavior and configuration of <see cref=\"SwipeItems\"/>.\n/// </summary>\n\npublic class SwipeItemsTests\n{\n\t[Fact]\n\tpublic void SwipeItemsCanBeCreated()\n\t{\n\t\tvar swipeItems = new SwipeItems();\n\t\tAssert.NotNull(swipeItems);\n\t}\n\n\t[Fact]\n\tpublic void ItemsCollectionIsInitialized()\n\t{\n\t\tvar swipeItems = new SwipeItems();\n\t\tAssert.NotNull(swipeItems.Items);\n\t\tAssert.Empty(swipeItems.Items);\n\t}\n\n\t[Fact]\n\tpublic void ModeDefaultsToReveal()\n\t{\n\t\tvar swipeItems = new SwipeItems();\n\t\tAssert.Equal(SwipeMode.Reveal, swipeItems.Mode);\n\t}\n\n\t[Fact]\n\tpublic void SwipeBehaviorOnInvokedDefaultsToAuto()\n\t{\n\t\tvar swipeItems = new SwipeItems();\n\t\tAssert.Equal(SwipeBehaviorOnInvoked.Auto, swipeItems.SwipeBehaviorOnInvoked);\n\t}\n\n\t[Fact]\n\tpublic void ModeCanBeSet()\n\t{\n\t\tvar swipeItems = new SwipeItems { Mode = SwipeMode.Execute };\n\t\tAssert.Equal(SwipeMode.Execute, swipeItems.Mode);\n\t}\n\n\t[Fact]\n\tpublic void SwipeBehaviorOnInvokedCanBeSet()\n\t{\n\t\tvar swipeItems = new SwipeItems { SwipeBehaviorOnInvoked = SwipeBehaviorOnInvoked.Close };\n\t\tAssert.Equal(SwipeBehaviorOnInvoked.Close, swipeItems.SwipeBehaviorOnInvoked);\n\t}\n\n\t[Fact]\n\tpublic void CanAddItemsToCollection()\n\t{\n\t\tvar swipeItems = new SwipeItems();\n\t\tvar item = new SwipeItem { Text = \"Delete\" };\n\t\t\n\t\tswipeItems.Items.Add(item);\n\t\t\n\t\tAssert.Single(swipeItems.Items);\n\t\tAssert.Same(item, swipeItems.Items[0]);\n\t}\n\n\t[Fact]\n\tpublic void ConstructorWithItemsCollectionWorks()\n\t{\n\t\tvar item1 = new SwipeItem { Text = \"Delete\" };\n\t\tvar item2 = new SwipeItem { Text = \"Archive\" };\n\t\tvar items = new[] { item1, item2 };\n\t\t\n\t\tvar swipeItems = new SwipeItems(items);\n\t\t\n\t\tAssert.Equal(2, swipeItems.Items.Count);\n\t\tAssert.Same(item1, swipeItems.Items[0]);\n\t\tAssert.Same(item2, swipeItems.Items[1]);\n\t}\n\n\t[Fact]\n\tpublic void ConstructorWithNullItemsThrows()\n\t{\n\t\tAssert.Throws<ArgumentNullException>(() => new SwipeItems(null!));\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnModeChange()\n\t{\n\t\tvar swipeItems = new SwipeItems();\n\t\tvar propertyChangedFired = false;\n\t\tswipeItems.PropertyChanged += (s, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(SwipeItems.Mode))\n\t\t\t\tpropertyChangedFired = true;\n\t\t};\n\n\t\tswipeItems.Mode = SwipeMode.Execute;\n\t\tAssert.True(propertyChangedFired);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnSwipeBehaviorOnInvokedChange()\n\t{\n\t\tvar swipeItems = new SwipeItems();\n\t\tvar propertyChangedFired = false;\n\t\tswipeItems.PropertyChanged += (s, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(SwipeItems.SwipeBehaviorOnInvoked))\n\t\t\t\tpropertyChangedFired = true;\n\t\t};\n\n\t\tswipeItems.SwipeBehaviorOnInvoked = SwipeBehaviorOnInvoked.RemainOpen;\n\t\tAssert.True(propertyChangedFired);\n\t}\n\n\t[Fact]\n\tpublic void ConstructorWithEmptyCollectionWorks()\n\t{\n\t\tvar swipeItems = new SwipeItems(Array.Empty<SwipeItem>());\n\t\tAssert.Empty(swipeItems.Items);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/SwipeViewTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for SwipeView functionality\n/// </summary>\npublic class SwipeViewTests\n{\n\t[Fact]\n\tpublic void CanCreate()\n\t{\n\t\tvar swipeView = new SwipeView();\n\t\tAssert.NotNull(swipeView);\n\t}\n\n\t[Fact]\n\tpublic void ContentIsNullByDefault()\n\t{\n\t\tvar swipeView = new SwipeView();\n\t\tAssert.Null(swipeView.Content);\n\t}\n\n\t[Fact]\n\tpublic void CanSetContent()\n\t{\n\t\tvar swipeView = new SwipeView();\n\t\tvar label = new Label { Text = \"Test\" };\n\n\t\tswipeView.Content = label;\n\n\t\tAssert.NotNull(swipeView.Content);\n\t\tAssert.Equal(label, swipeView.Content);\n\t}\n\n\t[Fact]\n\tpublic void SwipeItemsAreNullByDefault()\n\t{\n\t\tvar swipeView = new SwipeView();\n\t\tAssert.Null(swipeView.LeftItems);\n\t\tAssert.Null(swipeView.RightItems);\n\t\tAssert.Null(swipeView.TopItems);\n\t\tAssert.Null(swipeView.BottomItems);\n\t}\n\n\t[Fact]\n\tpublic void CanSetLeftItems()\n\t{\n\t\tvar swipeView = new SwipeView();\n\t\tvar items = new SwipeItems();\n\t\titems.Items.Add(new SwipeItem { Text = \"Delete\" });\n\n\t\tswipeView.LeftItems = items;\n\n\t\tAssert.NotNull(swipeView.LeftItems);\n\t\tAssert.Single(swipeView.LeftItems.Items);\n\t}\n\n\t[Fact]\n\tpublic void CanSetRightItems()\n\t{\n\t\tvar swipeView = new SwipeView();\n\t\tvar items = new SwipeItems();\n\t\titems.Items.Add(new SwipeItem { Text = \"Archive\" });\n\n\t\tswipeView.RightItems = items;\n\n\t\tAssert.NotNull(swipeView.RightItems);\n\t\tAssert.Single(swipeView.RightItems.Items);\n\t}\n\n\t[Fact]\n\tpublic void CanSetTopItems()\n\t{\n\t\tvar swipeView = new SwipeView();\n\t\tvar items = new SwipeItems();\n\t\titems.Items.Add(new SwipeItem { Text = \"Flag\" });\n\n\t\tswipeView.TopItems = items;\n\n\t\tAssert.NotNull(swipeView.TopItems);\n\t\tAssert.Single(swipeView.TopItems.Items);\n\t}\n\n\t[Fact]\n\tpublic void CanSetBottomItems()\n\t{\n\t\tvar swipeView = new SwipeView();\n\t\tvar items = new SwipeItems();\n\t\titems.Items.Add(new SwipeItem { Text = \"Share\" });\n\n\t\tswipeView.BottomItems = items;\n\n\t\tAssert.NotNull(swipeView.BottomItems);\n\t\tAssert.Single(swipeView.BottomItems.Items);\n\t}\n\n\t[Fact]\n\tpublic void SwipeItemHasDefaultProperties()\n\t{\n\t\tvar swipeItem = new SwipeItem();\n\n\t\tAssert.Null(swipeItem.Text);\n\t\tAssert.Null(swipeItem.BackgroundColor);\n\t\tAssert.True(swipeItem.IsVisible);\n\t\tAssert.Null(swipeItem.Invoked);\n\t}\n\n\t[Fact]\n\tpublic void CanSetSwipeItemProperties()\n\t{\n\t\tvar swipeItem = new SwipeItem\n\t\t{\n\t\t\tText = \"Delete\",\n\t\t\tBackgroundColor = Colors.Red,\n\t\t\tIsVisible = false\n\t\t};\n\n\t\tAssert.Equal(\"Delete\", swipeItem.Text);\n\t\tAssert.Equal(Colors.Red, swipeItem.BackgroundColor);\n\t\tAssert.False(swipeItem.IsVisible);\n\t}\n\n\t[Fact]\n\tpublic void SwipeItemInvokedFiresAction()\n\t{\n\t\tbool invoked = false;\n\t\tvar swipeItem = new SwipeItem\n\t\t{\n\t\t\tText = \"Test\",\n\t\t\tInvoked = item => invoked = true\n\t\t};\n\n\t\tswipeItem.Invoked?.Invoke(swipeItem);\n\n\t\tAssert.True(invoked);\n\t}\n\n\t[Fact]\n\tpublic void SwipeItemsHasDefaultMode()\n\t{\n\t\tvar swipeItems = new SwipeItems();\n\t\tAssert.Equal(SwipeMode.Reveal, swipeItems.Mode);\n\t}\n\n\t[Fact]\n\tpublic void SwipeItemsHasDefaultBehavior()\n\t{\n\t\tvar swipeItems = new SwipeItems();\n\t\tAssert.Equal(SwipeBehaviorOnInvoked.Auto, swipeItems.SwipeBehaviorOnInvoked);\n\t}\n\n\t[Fact]\n\tpublic void CanSetSwipeItemsMode()\n\t{\n\t\tvar swipeItems = new SwipeItems { Mode = SwipeMode.Execute };\n\t\tAssert.Equal(SwipeMode.Execute, swipeItems.Mode);\n\t}\n\n\t[Fact]\n\tpublic void CanSetSwipeItemsBehavior()\n\t{\n\t\tvar swipeItems = new SwipeItems { SwipeBehaviorOnInvoked = SwipeBehaviorOnInvoked.RemainOpen };\n\t\tAssert.Equal(SwipeBehaviorOnInvoked.RemainOpen, swipeItems.SwipeBehaviorOnInvoked);\n\t}\n\n\t[Fact]\n\tpublic void CanCreateSwipeItemsWithCollection()\n\t{\n\t\tvar items = new List<SwipeItem>\n\t\t{\n\t\t\tnew SwipeItem { Text = \"Delete\" },\n\t\t\tnew SwipeItem { Text = \"Archive\" }\n\t\t};\n\n\t\tvar swipeItems = new SwipeItems(items);\n\n\t\tAssert.Equal(2, swipeItems.Items.Count);\n\t\tAssert.Equal(\"Delete\", swipeItems.Items[0].Text);\n\t\tAssert.Equal(\"Archive\", swipeItems.Items[1].Text);\n\t}\n\n\t[Fact]\n\tpublic void ThresholdDefaultsToZero()\n\t{\n\t\tvar swipeView = new SwipeView();\n\t\tAssert.Equal(0, swipeView.Threshold);\n\t}\n\n\t[Fact]\n\tpublic void CanSetThreshold()\n\t{\n\t\tvar swipeView = new SwipeView { Threshold = 100 };\n\t\tAssert.Equal(100, swipeView.Threshold);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnContentChange()\n\t{\n\t\tstring? property = null;\n\t\tvar swipeView = new SwipeView();\n\t\tswipeView.PropertyChanged += (sender, e) => property = e.PropertyName;\n\n\t\tvar label = new Label { Text = \"Test\" };\n\t\tswipeView.Content = label;\n\n\t\tAssert.Equal(nameof(swipeView.Content), property);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnLeftItemsChange()\n\t{\n\t\tstring? property = null;\n\t\tvar swipeView = new SwipeView();\n\t\tswipeView.PropertyChanged += (sender, e) => property = e.PropertyName;\n\n\t\tswipeView.LeftItems = new SwipeItems();\n\n\t\tAssert.Equal(nameof(swipeView.LeftItems), property);\n\t}\n\n\t[Fact]\n\tpublic void CanContainComplexContent()\n\t{\n\t\tvar swipeView = new SwipeView();\n\t\tvar stackLayout = new StackLayout\n\t\t{\n\t\t\tnew Label { Text = \"Title\" },\n\t\t\tnew Label { Text = \"Description\" },\n\t\t\tnew Button { Text = \"Action\" }\n\t\t};\n\n\t\tswipeView.Content = stackLayout;\n\n\t\tAssert.Equal(stackLayout, swipeView.Content);\n\t\tAssert.Equal(3, stackLayout.Children.Count);\n\t}\n\n\t[Fact]\n\tpublic void SwipeViewCanBeNestedInOtherViews()\n\t{\n\t\tvar outerStack = new StackLayout();\n\t\tvar swipeView = new SwipeView\n\t\t{\n\t\t\tContent = new Label { Text = \"Inside SwipeView\" }\n\t\t};\n\n\t\touterStack.Add(swipeView);\n\n\t\tAssert.Single(outerStack.Children);\n\t\tAssert.Equal(swipeView, outerStack.Children[0]);\n\t\tAssert.NotNull(swipeView.Content);\n\t}\n\n\t[Fact]\n\tpublic void MultipleSwipeViewsCanExist()\n\t{\n\t\tvar swipeView1 = new SwipeView { Content = new Label { Text = \"First\" } };\n\t\tvar swipeView2 = new SwipeView { Content = new Label { Text = \"Second\" } };\n\t\tvar swipeView3 = new SwipeView { Content = new Label { Text = \"Third\" } };\n\n\t\tvar stackLayout = new StackLayout\n\t\t{\n\t\t\tswipeView1,\n\t\t\tswipeView2,\n\t\t\tswipeView3\n\t\t};\n\n\t\tAssert.Equal(3, stackLayout.Children.Count);\n\t\tAssert.NotNull(swipeView1.Content);\n\t\tAssert.NotNull(swipeView2.Content);\n\t\tAssert.NotNull(swipeView3.Content);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/SwitchTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for the Switch control\n/// </summary>\npublic class SwitchTests\n{\n\t[Fact]\n\tpublic void SwitchCreation()\n\t{\n\t\tvar switchControl = new Switch();\n\t\tAssert.NotNull(switchControl);\n\t\tAssert.False(switchControl.IsOn);\n\t}\n\n\t[Fact]\n\tpublic void IsOnPropertyWorks()\n\t{\n\t\tvar switchControl = new Switch { IsOn = true };\n\t\tAssert.True(switchControl.IsOn);\n\t}\n\n\t[Fact]\n\tpublic void IsOnPropertyChangedEvent()\n\t{\n\t\tstring? property = null;\n\t\tvar switchControl = new Switch();\n\t\tswitchControl.PropertyChanged += (sender, e) => property = e.PropertyName;\n\t\tswitchControl.IsOn = true;\n\n\t\tAssert.Equal(nameof(switchControl.IsOn), property);\n\t\tAssert.True(switchControl.IsOn);\n\t}\n\n\t[Fact]\n\tpublic void ToggledActionWorks()\n\t{\n\t\tvar switchControl = new Switch();\n\t\tAssert.Null(switchControl.Toggled);\n\n\t\tswitchControl.Toggled = _ => { };\n\t\tAssert.NotNull(switchControl.Toggled);\n\t}\n\n\t[Fact]\n\tpublic void ToggledActionCanBeCleared()\n\t{\n\t\tvar switchControl = new Switch\n\t\t{\n\t\t\tToggled = _ => { }\n\t\t};\n\n\t\tswitchControl.Toggled = null;\n\t\tAssert.Null(switchControl.Toggled);\n\t}\n\n\t[Fact]\n\tpublic void SwitchInheritsFromView()\n\t{\n\t\tvar switchControl = new Switch();\n\t\tAssert.IsAssignableFrom<View>(switchControl);\n\t}\n\n}\n"
  },
  {
    "path": "tests/Spice.Tests/TabViewTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Contains unit tests verifying the behavior of TabView and Tab.\n/// </summary>\npublic class TabViewTests\n{\n\tclass TestView : View\n\t{\n\t\tpublic TestView()\n\t\t{\n\t\t\tTitle = \"Test View\";\n\t\t}\n\t}\n\n\tclass SecondView : View\n\t{\n\t\tpublic SecondView()\n\t\t{\n\t\t\tTitle = \"Second View\";\n\t\t}\n\t}\n\n\t[Fact]\n\tpublic void TabViewCanBeCreated()\n\t{\n\t\tvar tabView = new TabView();\n\t\tAssert.NotNull(tabView);\n\t}\n\n\t[Fact]\n\tpublic void TabViewInheritsFromView()\n\t{\n\t\tvar tabView = new TabView();\n\t\tAssert.IsAssignableFrom<View>(tabView);\n\t}\n\n\t[Fact]\n\tpublic void TabCanBeCreated()\n\t{\n\t\tvar content = new TestView();\n\t\tvar tab = new Tab(\"Home\", \"home.png\", content);\n\t\tAssert.NotNull(tab);\n\t}\n\n\t[Fact]\n\tpublic void TabInheritsFromView()\n\t{\n\t\tvar content = new TestView();\n\t\tvar tab = new Tab(\"Home\", \"home.png\", content);\n\t\tAssert.IsAssignableFrom<View>(tab);\n\t}\n\n\t[Fact]\n\tpublic void TabGenericCanBeCreated()\n\t{\n\t\tvar tab = new Tab<TestView>(\"Home\", \"home.png\");\n\t\tAssert.NotNull(tab);\n\t}\n\n\t[Fact]\n\tpublic void TabGenericInheritsFromTab()\n\t{\n\t\tvar tab = new Tab<TestView>(\"Home\", \"home.png\");\n\t\tAssert.IsAssignableFrom<Tab>(tab);\n\t}\n\n\t[Fact]\n\tpublic void TabTitleIsSet()\n\t{\n\t\tvar content = new TestView();\n\t\tvar tab = new Tab(\"Home\", \"home.png\", content);\n\t\tAssert.Equal(\"Home\", tab.Title);\n\t}\n\n\t[Fact]\n\tpublic void TabIconIsSet()\n\t{\n\t\tvar content = new TestView();\n\t\tvar tab = new Tab(\"Home\", \"home.png\", content);\n\t\tAssert.Equal(\"home.png\", tab.Icon);\n\t}\n\n\t[Fact]\n\tpublic void TabContentIsSet()\n\t{\n\t\tvar content = new TestView();\n\t\tvar tab = new Tab(\"Home\", \"home.png\", content);\n\t\tAssert.Equal(content, tab.Content);\n\t}\n\n\t[Fact]\n\tpublic void TabWithFactoryCreatesContentLazily()\n\t{\n\t\tvar factoryCalled = false;\n\t\tvar tab = new Tab(\"Home\", \"home.png\", () =>\n\t\t{\n\t\t\tfactoryCalled = true;\n\t\t\treturn new TestView();\n\t\t});\n\t\t\n\t\t// Factory should not be called yet\n\t\tAssert.False(factoryCalled);\n\t\tAssert.Null(tab.Content);\n\t\t\n\t\t// Ensure content creates it\n\t\ttab.EnsureContent();\n\t\tAssert.True(factoryCalled);\n\t\tAssert.NotNull(tab.Content);\n\t}\n\n\t[Fact]\n\tpublic void TabGenericCreatesContentLazily()\n\t{\n\t\tvar tab = new Tab<TestView>(\"Home\", \"home.png\");\n\t\t\n\t\t// Content should not be created yet\n\t\tAssert.Null(tab.Content);\n\t\t\n\t\t// Ensure content creates it\n\t\ttab.EnsureContent();\n\t\tAssert.NotNull(tab.Content);\n\t\tAssert.IsType<TestView>(tab.Content);\n\t}\n\n\t[Fact]\n\tpublic void TabViewAddMethodWorks()\n\t{\n\t\tvar tabView = new TabView();\n\t\tvar tab = new Tab<TestView>(\"Home\", \"home.png\");\n\t\t\n\t\ttabView.Add(tab);\n\t\t\n\t\tAssert.Single(tabView.Children);\n\t\tAssert.Equal(tab, tabView.Children[0]);\n\t}\n\n\t[Fact]\n\tpublic void TabViewCollectionInitializerWorks()\n\t{\n\t\tvar tabView = new TabView\n\t\t{\n\t\t\tnew Tab<TestView>(\"Home\", \"home.png\"),\n\t\t\tnew Tab<SecondView>(\"Profile\", \"profile.png\")\n\t\t};\n\t\t\n\t\tAssert.Equal(2, tabView.Children.Count);\n\t}\n\n\t[Fact]\n\tpublic void TabConstructorWithNullTitleThrows()\n\t{\n\t\tvar content = new TestView();\n\t\tAssert.Throws<ArgumentNullException>(() => new Tab(null!, \"icon.png\", content));\n\t}\n\n\t[Fact]\n\tpublic void TabConstructorWithNullIconThrows()\n\t{\n\t\tvar content = new TestView();\n\t\tAssert.Throws<ArgumentNullException>(() => new Tab(\"Title\", null!, content));\n\t}\n\n\t[Fact]\n\tpublic void TabConstructorWithNullContentThrows()\n\t{\n\t\tAssert.Throws<ArgumentNullException>(() => new Tab(\"Title\", \"icon.png\", (View)null!));\n\t}\n\n\t[Fact]\n\tpublic void TabConstructorWithNullFactoryThrows()\n\t{\n\t\tAssert.Throws<ArgumentNullException>(() => new Tab(\"Title\", \"icon.png\", (Func<View>)null!));\n\t}\n\n\t[Fact]\n\tpublic void TabViewAddWithNullThrows()\n\t{\n\t\tvar tabView = new TabView();\n\t\tAssert.Throws<ArgumentNullException>(() => tabView.Add(null!));\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnIconChange()\n\t{\n\t\tvar content = new TestView();\n\t\tvar tab = new Tab(\"Home\", \"home.png\", content);\n\t\tvar propertyChangedFired = false;\n\t\ttab.PropertyChanged += (s, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(Tab.Icon))\n\t\t\t\tpropertyChangedFired = true;\n\t\t};\n\n\t\ttab.Icon = \"new_icon.png\";\n\t\tAssert.True(propertyChangedFired);\n\t}\n\n\t[Fact]\n\tpublic void EnsureContentOnlyCreatesContentOnce()\n\t{\n\t\tvar callCount = 0;\n\t\tvar tab = new Tab(\"Home\", \"home.png\", () =>\n\t\t{\n\t\t\tcallCount++;\n\t\t\treturn new TestView();\n\t\t});\n\t\t\n\t\ttab.EnsureContent();\n\t\ttab.EnsureContent();\n\t\ttab.EnsureContent();\n\t\t\n\t\tAssert.Equal(1, callCount);\n\t}\n\n\t[Fact]\n\tpublic void TabContentAddsToChildren()\n\t{\n\t\tvar content = new TestView();\n\t\tvar tab = new Tab(\"Home\", \"home.png\", content);\n\t\t\n\t\tAssert.Single(tab.Children);\n\t\tAssert.Equal(content, tab.Children[0]);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/TestViewModel.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Simple test ViewModel for binding tests.\n/// Implements INotifyPropertyChanged manually to avoid requiring CommunityToolkit.Mvvm\n/// source generators in the test project.\n/// </summary>\ninternal class TestViewModel : System.ComponentModel.INotifyPropertyChanged\n{\n\tpublic event System.ComponentModel.PropertyChangedEventHandler? PropertyChanged;\n\n\tprivate string _title = string.Empty;\n\tpublic string Title\n\t{\n\t\tget => _title;\n\t\tset { _title = value; PropertyChanged?.Invoke(this, new System.ComponentModel.PropertyChangedEventArgs(nameof(Title))); }\n\t}\n\n\tprivate int _count;\n\tpublic int Count\n\t{\n\t\tget => _count;\n\t\tset { _count = value; PropertyChanged?.Invoke(this, new System.ComponentModel.PropertyChangedEventArgs(nameof(Count))); }\n\t}\n\n\tprivate bool _isEnabled;\n\tpublic bool IsEnabled\n\t{\n\t\tget => _isEnabled;\n\t\tset { _isEnabled = value; PropertyChanged?.Invoke(this, new System.ComponentModel.PropertyChangedEventArgs(nameof(IsEnabled))); }\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/ThemeTests.cs",
    "content": "using System.ComponentModel;\n\nnamespace Spice.Tests;\n\n/// <summary>\n/// Tests for the Theme class and theming infrastructure (Phases 1-4 of THEME-SPEC.md).\n/// </summary>\npublic class ThemeTests\n{\n\n\t[Fact]\n\tpublic void ThemeCanBeCreated()\n\t{\n\t\tvar theme = new Theme();\n\t\tAssert.NotNull(theme);\n\t}\n\n\t[Fact]\n\tpublic void ThemeDefaultsToNull()\n\t{\n\t\tvar theme = new Theme();\n\t\tAssert.Null(theme.TextColor);\n\t\tAssert.Null(theme.BackgroundColor);\n\t\tAssert.Null(theme.AccentColor);\n\t\tAssert.Null(theme.StrokeColor);\n\t\tAssert.Null(theme.PlaceholderColor);\n\t}\n\n\t[Fact]\n\tpublic void ThemeLightHasExpectedColors()\n\t{\n\t\tvar theme = Theme.Light;\n\t\tAssert.Equal(Colors.Black, theme.TextColor);\n\t\tAssert.Equal(Colors.White, theme.BackgroundColor);\n\t\tAssert.NotNull(theme.AccentColor);\n\t\tAssert.NotNull(theme.StrokeColor);\n\t\tAssert.Equal(Colors.DarkGray, theme.PlaceholderColor);\n\t}\n\n\t[Fact]\n\tpublic void ThemeDarkHasExpectedColors()\n\t{\n\t\tvar theme = Theme.Dark;\n\t\tAssert.Equal(Colors.White, theme.TextColor);\n\t\tAssert.NotNull(theme.BackgroundColor);\n\t\tAssert.NotNull(theme.AccentColor);\n\t\tAssert.NotNull(theme.StrokeColor);\n\t\tAssert.Equal(Colors.LightGray, theme.PlaceholderColor);\n\t}\n\n\t[Fact]\n\tpublic void ThemeFiresPropertyChanged()\n\t{\n\t\tvar theme = new Theme();\n\t\tstring? changedProp = null;\n\t\ttheme.PropertyChanged += (s, e) => changedProp = e.PropertyName;\n\n\t\ttheme.TextColor = Colors.Red;\n\t\tAssert.Equal(nameof(Theme.TextColor), changedProp);\n\t}\n\n\t[Fact]\n\tpublic void ApplicationThemeDefaultsToNull()\n\t{\n\t\tvar app = new Application();\n\t\tAssert.Null(app.Theme);\n\t}\n\n\t[Fact]\n\tpublic void ThemeAppliesBackgroundColorToView()\n\t{\n\t\tvar app = new Application();\n\t\tvar view = new View();\n\t\tapp.Main = new StackLayout { view };\n\t\tapp.Theme = Theme.Light;\n\n\t\tAssert.Equal(Colors.White, view.BackgroundColor);\n\t}\n\n\t[Fact]\n\tpublic void ThemeAppliesTextColorToLabel()\n\t{\n\t\tvar app = new Application();\n\t\tvar label = new Label { Text = \"Hello\" };\n\t\tapp.Main = new StackLayout { label };\n\t\tapp.Theme = Theme.Light;\n\n\t\tAssert.Equal(Colors.Black, label.TextColor);\n\t\tAssert.Equal(Colors.White, label.BackgroundColor);\n\t}\n\n\t[Fact]\n\tpublic void ThemeAppliesTextColorAndAccentToButton()\n\t{\n\t\tvar app = new Application();\n\t\tvar button = new Button { Text = \"Tap\" };\n\t\tapp.Main = new StackLayout { button };\n\t\tapp.Theme = Theme.Light;\n\n\t\tAssert.Equal(Colors.Black, button.TextColor);\n\t\t// Button BackgroundColor should be AccentColor, not BackgroundColor\n\t\tAssert.Equal(Theme.Light.AccentColor, button.BackgroundColor);\n\t}\n\n\t[Fact]\n\tpublic void ThemeAppliesStrokeColorToBorder()\n\t{\n\t\tvar app = new Application();\n\t\tvar border = new Border();\n\t\tapp.Main = new StackLayout { border };\n\t\tapp.Theme = Theme.Light;\n\n\t\tAssert.Equal(Theme.Light.StrokeColor, border.Stroke);\n\t\tAssert.Equal(Colors.White, border.BackgroundColor);\n\t}\n\n\t[Fact]\n\tpublic void ThemeAppliesTextColorToEntry()\n\t{\n\t\tvar app = new Application();\n\t\tvar entry = new Entry();\n\t\tapp.Main = new StackLayout { entry };\n\t\tapp.Theme = Theme.Light;\n\n\t\tAssert.Equal(Colors.Black, entry.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void ThemeAppliesTextAndPlaceholderColorToEditor()\n\t{\n\t\tvar app = new Application();\n\t\tvar editor = new Editor();\n\t\tapp.Main = new StackLayout { editor };\n\t\tapp.Theme = Theme.Light;\n\n\t\tAssert.Equal(Colors.Black, editor.TextColor);\n\t\tAssert.Equal(Colors.DarkGray, editor.PlaceholderColor);\n\t}\n\n\t[Fact]\n\tpublic void ThemeAppliesTextAndPlaceholderColorToSearchBar()\n\t{\n\t\tvar app = new Application();\n\t\tvar searchBar = new SearchBar();\n\t\tapp.Main = new StackLayout { searchBar };\n\t\tapp.Theme = Theme.Light;\n\n\t\tAssert.Equal(Colors.Black, searchBar.TextColor);\n\t\tAssert.Equal(Colors.DarkGray, searchBar.PlaceholderColor);\n\t}\n\n\t[Fact]\n\tpublic void ThemeAppliesTextColorToDatePicker()\n\t{\n\t\tvar app = new Application();\n\t\tvar datePicker = new DatePicker();\n\t\tapp.Main = new StackLayout { datePicker };\n\t\tapp.Theme = Theme.Light;\n\n\t\tAssert.Equal(Colors.Black, datePicker.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void ThemeAppliesTextColorToPicker()\n\t{\n\t\tvar app = new Application();\n\t\tvar picker = new Picker();\n\t\tapp.Main = new StackLayout { picker };\n\t\tapp.Theme = Theme.Light;\n\n\t\tAssert.Equal(Colors.Black, picker.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void ThemeAppliesAccentColorToActivityIndicator()\n\t{\n\t\tvar app = new Application();\n\t\tvar ai = new ActivityIndicator();\n\t\tapp.Main = new StackLayout { ai };\n\t\tapp.Theme = Theme.Light;\n\n\t\tAssert.Equal(Theme.Light.AccentColor, ai.Color);\n\t}\n\n\t[Fact]\n\tpublic void ThemeAppliedToEntireTree()\n\t{\n\t\tvar app = new Application();\n\t\tvar label1 = new Label { Text = \"A\" };\n\t\tvar label2 = new Label { Text = \"B\" };\n\t\tvar nested = new StackLayout { label2 };\n\t\tapp.Main = new StackLayout { label1, nested };\n\t\tapp.Theme = Theme.Light;\n\n\t\tAssert.Equal(Colors.Black, label1.TextColor);\n\t\tAssert.Equal(Colors.Black, label2.TextColor);\n\t\tAssert.Equal(Colors.White, nested.BackgroundColor);\n\t}\n\n\t[Fact]\n\tpublic void ThemeAppliedWhenMainSetAfterTheme()\n\t{\n\t\tvar app = new Application();\n\t\tapp.Theme = Theme.Light;\n\t\tvar label = new Label { Text = \"Hello\" };\n\t\tapp.Main = new StackLayout { label };\n\n\t\tAssert.Equal(Colors.Black, label.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void SwappingThemeUpdatesAllViews()\n\t{\n\t\tvar app = new Application();\n\t\tvar label = new Label { Text = \"Hello\" };\n\t\tapp.Main = new StackLayout { label };\n\n\t\tapp.Theme = Theme.Light;\n\t\tAssert.Equal(Colors.Black, label.TextColor);\n\t\tAssert.Equal(Colors.White, label.BackgroundColor);\n\n\t\tapp.Theme = Theme.Dark;\n\t\tAssert.Equal(Colors.White, label.TextColor);\n\t\tAssert.Equal(Theme.Dark.BackgroundColor, label.BackgroundColor);\n\t}\n\n\t[Fact]\n\tpublic void LiveThemePropertyChangeUpdatesViews()\n\t{\n\t\tvar app = new Application();\n\t\tvar label = new Label { Text = \"Hello\" };\n\t\tapp.Main = new StackLayout { label };\n\n\t\tvar theme = new Theme { TextColor = Colors.Red };\n\t\tapp.Theme = theme;\n\t\tAssert.Equal(Colors.Red, label.TextColor);\n\n\t\t// Live update: change a color on the existing theme\n\t\ttheme.TextColor = Colors.Green;\n\t\tAssert.Equal(Colors.Green, label.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void NullThemeDoesNotChangeColors()\n\t{\n\t\tvar app = new Application();\n\t\tvar label = new Label { Text = \"Hello\", TextColor = Colors.Red };\n\t\tapp.Main = new StackLayout { label };\n\n\t\t// No theme set - colors should remain as-is\n\t\tAssert.Equal(Colors.Red, label.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void SettingThemeToNullDoesNotCrash()\n\t{\n\t\tvar app = new Application();\n\t\tvar label = new Label { Text = \"Hello\" };\n\t\tapp.Main = new StackLayout { label };\n\t\tapp.Theme = Theme.Light;\n\t\tapp.Theme = null;\n\t\t// Should not throw\n\t}\n\n\t[Fact]\n\tpublic void ExplicitTextColorWins()\n\t{\n\t\tvar app = new Application();\n\t\tvar label = new Label { Text = \"Always red\", TextColor = Colors.Red };\n\t\tapp.Main = new StackLayout { label };\n\t\tapp.Theme = Theme.Light;\n\n\t\t// Explicit override wins over theme\n\t\tAssert.Equal(Colors.Red, label.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void ExplicitBackgroundColorWins()\n\t{\n\t\tvar app = new Application();\n\t\tvar view = new View { BackgroundColor = Colors.Green };\n\t\tapp.Main = new StackLayout { view };\n\t\tapp.Theme = Theme.Light;\n\n\t\tAssert.Equal(Colors.Green, view.BackgroundColor);\n\t}\n\n\t[Fact]\n\tpublic void ExplicitStrokeColorWins()\n\t{\n\t\tvar app = new Application();\n\t\tvar border = new Border { Stroke = Colors.Red };\n\t\tapp.Main = new StackLayout { border };\n\t\tapp.Theme = Theme.Light;\n\n\t\tAssert.Equal(Colors.Red, border.Stroke);\n\t}\n\n\t[Fact]\n\tpublic void ExplicitButtonBackgroundColorWins()\n\t{\n\t\tvar app = new Application();\n\t\tvar button = new Button { Text = \"Custom\", BackgroundColor = Colors.Purple };\n\t\tapp.Main = new StackLayout { button };\n\t\tapp.Theme = Theme.Light;\n\n\t\tAssert.Equal(Colors.Purple, button.BackgroundColor);\n\t}\n\n\t[Fact]\n\tpublic void ExplicitActivityIndicatorColorWins()\n\t{\n\t\tvar app = new Application();\n\t\tvar ai = new ActivityIndicator { Color = Colors.Red };\n\t\tapp.Main = new StackLayout { ai };\n\t\tapp.Theme = Theme.Light;\n\n\t\tAssert.Equal(Colors.Red, ai.Color);\n\t}\n\n\t[Fact]\n\tpublic void NullResetsToThemeColor()\n\t{\n\t\tvar app = new Application();\n\t\tvar label = new Label { Text = \"Hello\", TextColor = Colors.Red };\n\t\tapp.Main = new StackLayout { label };\n\t\tapp.Theme = Theme.Light;\n\n\t\tAssert.Equal(Colors.Red, label.TextColor);\n\n\t\t// Null clears the explicit override\n\t\tlabel.TextColor = null;\n\t\t// Re-apply theme to pick up the change\n\t\tapp.Theme = Theme.Light;\n\t\tAssert.Equal(Colors.Black, label.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void ExplicitOverrideSurvivesThemeSwap()\n\t{\n\t\tvar app = new Application();\n\t\tvar label = new Label { Text = \"Always red\", TextColor = Colors.Red };\n\t\tapp.Main = new StackLayout { label };\n\n\t\tapp.Theme = Theme.Light;\n\t\tAssert.Equal(Colors.Red, label.TextColor);\n\n\t\tapp.Theme = Theme.Dark;\n\t\tAssert.Equal(Colors.Red, label.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void ExplicitSetAfterThemeIsRespected()\n\t{\n\t\tvar app = new Application();\n\t\tvar label = new Label { Text = \"Hello\" };\n\t\tapp.Main = new StackLayout { label };\n\t\tapp.Theme = Theme.Light;\n\n\t\tAssert.Equal(Colors.Black, label.TextColor);\n\n\t\t// Developer sets explicit color after theme\n\t\tlabel.TextColor = Colors.Orange;\n\t\tAssert.Equal(Colors.Orange, label.TextColor);\n\n\t\t// Swapping theme should not overwrite the explicit value\n\t\tapp.Theme = Theme.Dark;\n\t\tAssert.Equal(Colors.Orange, label.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void NewChildrenGetThemed()\n\t{\n\t\tvar app = new Application();\n\t\tvar stack = new StackLayout();\n\t\tapp.Main = stack;\n\t\tapp.Theme = Theme.Light;\n\n\t\t// Add a label AFTER the theme was applied\n\t\tvar label = new Label { Text = \"Dynamic\" };\n\t\tstack.Children.Add(label);\n\n\t\tAssert.Equal(Colors.Black, label.TextColor);\n\t\tAssert.Equal(Colors.White, label.BackgroundColor);\n\t}\n\n\t[Fact]\n\tpublic void NestedDynamicChildrenGetThemed()\n\t{\n\t\tvar app = new Application();\n\t\tvar stack = new StackLayout();\n\t\tapp.Main = stack;\n\t\tapp.Theme = Theme.Light;\n\n\t\tvar innerStack = new StackLayout\n\t\t{\n\t\t\tnew Label { Text = \"Nested\" }\n\t\t};\n\t\tstack.Children.Add(innerStack);\n\n\t\tvar label = (Label)innerStack.Children[0];\n\t\tAssert.Equal(Colors.Black, label.TextColor);\n\t\tAssert.Equal(Colors.White, innerStack.BackgroundColor);\n\t}\n\n\t[Fact]\n\tpublic void UseSystemThemeSetsTheme()\n\t{\n\t\tvar app = new Application();\n\t\tvar label = new Label { Text = \"Hello\" };\n\t\tapp.Main = new StackLayout { label };\n\n\t\tapp.UseSystemTheme = true;\n\t\t// On net10.0 (VANILLA), IsDarkMode returns false, so Theme.Light is used\n\t\tAssert.NotNull(app.Theme);\n\t\tAssert.Equal(Colors.Black, label.TextColor);\n\t}\n\n\t[Fact]\n\tpublic void ExplicitThemeDisablesUseSystemTheme()\n\t{\n\t\tvar app = new Application();\n\t\tapp.UseSystemTheme = true;\n\t\tAssert.True(app.UseSystemTheme);\n\n\t\t// Setting Theme explicitly should disable UseSystemTheme\n\t\tapp.Theme = Theme.Dark;\n\t\tAssert.False(app.UseSystemTheme);\n\t}\n\n\t[Fact]\n\tpublic void PlatformAppearanceChangedUpdatesTheme()\n\t{\n\t\tvar app = new Application();\n\t\tvar label = new Label { Text = \"Hello\" };\n\t\tapp.Main = new StackLayout { label };\n\t\tapp.UseSystemTheme = true;\n\n\t\t// Simulate system appearance change\n\t\tPlatformAppearance.OnChanged(true);\n\t\tAssert.Equal(Colors.White, label.TextColor);\n\n\t\tPlatformAppearance.OnChanged(false);\n\t\tAssert.Equal(Colors.Black, label.TextColor);\n\n\t\t// Cleanup: unsubscribe\n\t\tapp.UseSystemTheme = false;\n\t}\n\n\t[Fact]\n\tpublic void AppearanceChangedCallbackInvoked()\n\t{\n\t\tvar app = new Application();\n\t\tapp.UseSystemTheme = true;\n\t\tbool? receivedDark = null;\n\t\tapp.AppearanceChanged = isDark => receivedDark = isDark;\n\n\t\tPlatformAppearance.OnChanged(true);\n\t\tAssert.True(receivedDark);\n\n\t\tPlatformAppearance.OnChanged(false);\n\t\tAssert.False(receivedDark);\n\n\t\t// Cleanup\n\t\tapp.UseSystemTheme = false;\n\t}\n\n\t[Fact]\n\tpublic void CustomThemeApplied()\n\t{\n\t\tvar corporate = new Theme\n\t\t{\n\t\t\tTextColor = Color.FromArgb(\"#333333\"),\n\t\t\tBackgroundColor = Color.FromArgb(\"#F5F5F5\"),\n\t\t\tAccentColor = Color.FromArgb(\"#FF6600\"),\n\t\t\tStrokeColor = Color.FromArgb(\"#CCCCCC\"),\n\t\t\tPlaceholderColor = Color.FromArgb(\"#999999\"),\n\t\t};\n\n\t\tvar app = new Application();\n\t\tvar label = new Label { Text = \"Corp\" };\n\t\tvar button = new Button { Text = \"Go\" };\n\t\tvar border = new Border();\n\t\tvar editor = new Editor();\n\n\t\tapp.Main = new StackLayout { label, button, border, editor };\n\t\tapp.Theme = corporate;\n\n\t\tAssert.Equal(Color.FromArgb(\"#333333\"), label.TextColor);\n\t\tAssert.Equal(Color.FromArgb(\"#FF6600\"), button.BackgroundColor);\n\t\tAssert.Equal(Color.FromArgb(\"#CCCCCC\"), border.Stroke);\n\t\tAssert.Equal(Color.FromArgb(\"#999999\"), editor.PlaceholderColor);\n\t}\n\n\t[Fact]\n\tpublic void FullScenarioFromSpec()\n\t{\n\t\tvar app = new Application { Theme = Theme.Light };\n\n\t\tvar label = new Label { Text = \"Hello, Spice 🌶\" };\n\t\tvar counter = new Label { Text = \"Times: 0\" };\n\t\tvar button = new Button { Text = \"Tap me\" };\n\t\tvar overrideLabel = new Label\n\t\t{\n\t\t\tText = \"I'm always red\",\n\t\t\tTextColor = Colors.Red,\n\t\t};\n\n\t\tapp.Main = new StackLayout\n\t\t{\n\t\t\tlabel,\n\t\t\tcounter,\n\t\t\tbutton,\n\t\t\toverrideLabel,\n\t\t};\n\n\t\t// Light theme applied\n\t\tAssert.Equal(Colors.Black, label.TextColor);\n\t\tAssert.Equal(Theme.Light.AccentColor, button.BackgroundColor);\n\t\tAssert.Equal(Colors.Red, overrideLabel.TextColor);\n\n\t\t// Switch to dark\n\t\tapp.Theme = Theme.Dark;\n\t\tAssert.Equal(Colors.White, label.TextColor);\n\t\tAssert.Equal(Theme.Dark.AccentColor, button.BackgroundColor);\n\t\tAssert.Equal(Colors.Red, overrideLabel.TextColor); // explicit override preserved\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/ThicknessTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for Thickness struct\n/// </summary>\npublic class ThicknessTests\n{\n\t[Fact]\n\tpublic void DefaultConstructor()\n\t{\n\t\tvar thickness = new Thickness();\n\t\tAssert.Equal(0, thickness.Left);\n\t\tAssert.Equal(0, thickness.Top);\n\t\tAssert.Equal(0, thickness.Right);\n\t\tAssert.Equal(0, thickness.Bottom);\n\t}\n\n\t[Fact]\n\tpublic void UniformConstructor()\n\t{\n\t\tvar thickness = new Thickness(10);\n\t\tAssert.Equal(10, thickness.Left);\n\t\tAssert.Equal(10, thickness.Top);\n\t\tAssert.Equal(10, thickness.Right);\n\t\tAssert.Equal(10, thickness.Bottom);\n\t}\n\n\t[Fact]\n\tpublic void HorizontalVerticalConstructor()\n\t{\n\t\tvar thickness = new Thickness(10, 20);\n\t\tAssert.Equal(10, thickness.Left);\n\t\tAssert.Equal(20, thickness.Top);\n\t\tAssert.Equal(10, thickness.Right);\n\t\tAssert.Equal(20, thickness.Bottom);\n\t}\n\n\t[Fact]\n\tpublic void IndividualSidesConstructor()\n\t{\n\t\tvar thickness = new Thickness(5, 10, 15, 20);\n\t\tAssert.Equal(5, thickness.Left);\n\t\tAssert.Equal(10, thickness.Top);\n\t\tAssert.Equal(15, thickness.Right);\n\t\tAssert.Equal(20, thickness.Bottom);\n\t}\n\n\t[Fact]\n\tpublic void HorizontalThickness()\n\t{\n\t\tvar thickness = new Thickness(5, 10, 15, 20);\n\t\tAssert.Equal(20, thickness.HorizontalThickness); // 5 + 15\n\t}\n\n\t[Fact]\n\tpublic void VerticalThickness()\n\t{\n\t\tvar thickness = new Thickness(5, 10, 15, 20);\n\t\tAssert.Equal(30, thickness.VerticalThickness); // 10 + 20\n\t}\n\n\t[Fact]\n\tpublic void IsEmptyWhenAllZero()\n\t{\n\t\tvar thickness = new Thickness(0);\n\t\tAssert.True(thickness.IsEmpty);\n\t}\n\n\t[Fact]\n\tpublic void IsNotEmptyWhenAnyNonZero()\n\t{\n\t\tAssert.False(new Thickness(1, 0, 0, 0).IsEmpty);\n\t\tAssert.False(new Thickness(0, 1, 0, 0).IsEmpty);\n\t\tAssert.False(new Thickness(0, 0, 1, 0).IsEmpty);\n\t\tAssert.False(new Thickness(0, 0, 0, 1).IsEmpty);\n\t}\n\n\t[Fact]\n\tpublic void ImplicitConversionFromDouble()\n\t{\n\t\tThickness thickness = 10.5;\n\t\tAssert.Equal(10.5, thickness.Left);\n\t\tAssert.Equal(10.5, thickness.Top);\n\t\tAssert.Equal(10.5, thickness.Right);\n\t\tAssert.Equal(10.5, thickness.Bottom);\n\t}\n\n\t[Fact]\n\tpublic void EqualityOperator()\n\t{\n\t\tvar t1 = new Thickness(10, 20, 30, 40);\n\t\tvar t2 = new Thickness(10, 20, 30, 40);\n\t\tvar t3 = new Thickness(5, 20, 30, 40);\n\n\t\tAssert.True(t1 == t2);\n\t\tAssert.False(t1 == t3);\n\t}\n\n\t[Fact]\n\tpublic void InequalityOperator()\n\t{\n\t\tvar t1 = new Thickness(10, 20, 30, 40);\n\t\tvar t2 = new Thickness(10, 20, 30, 40);\n\t\tvar t3 = new Thickness(5, 20, 30, 40);\n\n\t\tAssert.False(t1 != t2);\n\t\tAssert.True(t1 != t3);\n\t}\n\n\t[Fact]\n\tpublic void EqualsMethod()\n\t{\n\t\tvar t1 = new Thickness(10, 20, 30, 40);\n\t\tvar t2 = new Thickness(10, 20, 30, 40);\n\t\tvar t3 = new Thickness(5, 20, 30, 40);\n\n\t\tAssert.True(t1.Equals(t2));\n\t\tAssert.False(t1.Equals(t3));\n\t}\n\n\t[Fact]\n\tpublic void EqualsObjectMethod()\n\t{\n\t\tvar t1 = new Thickness(10, 20, 30, 40);\n\t\tobject t2 = new Thickness(10, 20, 30, 40);\n\t\tobject t3 = new Thickness(5, 20, 30, 40);\n\t\tobject notThickness = \"string\";\n\n\t\tAssert.True(t1.Equals(t2));\n\t\tAssert.False(t1.Equals(t3));\n\t\tAssert.False(t1.Equals(notThickness));\n\t\tAssert.False(t1.Equals(null));\n\t}\n\n\t[Fact]\n\tpublic void GetHashCodeConsistent()\n\t{\n\t\tvar t1 = new Thickness(10, 20, 30, 40);\n\t\tvar t2 = new Thickness(10, 20, 30, 40);\n\n\t\tAssert.Equal(t1.GetHashCode(), t2.GetHashCode());\n\t}\n\n\t[Fact]\n\tpublic void ToStringUniform()\n\t{\n\t\tvar thickness = new Thickness(10);\n\t\tAssert.Equal(\"10\", thickness.ToString());\n\t}\n\n\t[Fact]\n\tpublic void ToStringHorizontalVertical()\n\t{\n\t\tvar thickness = new Thickness(10, 20);\n\t\tAssert.Equal(\"10,20\", thickness.ToString());\n\t}\n\n\t[Fact]\n\tpublic void ToStringIndividual()\n\t{\n\t\tvar thickness = new Thickness(5, 10, 15, 20);\n\t\tAssert.Equal(\"5,10,15,20\", thickness.ToString());\n\t}\n\n\t[Fact]\n\tpublic void PropertiesCanBeSet()\n\t{\n\t\tvar thickness = new Thickness\n\t\t{\n\t\t\tLeft = 1,\n\t\t\tTop = 2,\n\t\t\tRight = 3,\n\t\t\tBottom = 4\n\t\t};\n\n\t\tAssert.Equal(1, thickness.Left);\n\t\tAssert.Equal(2, thickness.Top);\n\t\tAssert.Equal(3, thickness.Right);\n\t\tAssert.Equal(4, thickness.Bottom);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/TimePickerTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for TimePicker control\n/// </summary>\npublic class TimePickerTests\n{\n\t[Fact]\n\tpublic void TimePickerDefaultTime()\n\t{\n\t\tvar timePicker = new TimePicker();\n\t\t// Verify time is set to something reasonable (default is current time)\n\t\tAssert.NotEqual(default(TimeOnly), timePicker.Time);\n\t}\n\n\t[Fact]\n\tpublic void TimePickerSetTime()\n\t{\n\t\tvar timePicker = new TimePicker();\n\t\tvar expectedTime = new TimeOnly(14, 30);\n\t\ttimePicker.Time = expectedTime;\n\n\t\tAssert.Equal(expectedTime, timePicker.Time);\n\t}\n\n\t[Fact]\n\tpublic void TimePickerPropertyChanged()\n\t{\n\t\tstring? property = null;\n\t\tvar timePicker = new TimePicker();\n\t\ttimePicker.PropertyChanged += (sender, e) => property = e.PropertyName;\n\n\t\tvar newTime = new TimeOnly(10, 15);\n\t\ttimePicker.Time = newTime;\n\n\t\tAssert.Equal(nameof(timePicker.Time), property);\n\t}\n\n\t[Fact]\n\tpublic void TimePickerPropertyChanging()\n\t{\n\t\tstring? property = null;\n\t\tvar timePicker = new TimePicker();\n\t\ttimePicker.PropertyChanging += (sender, e) => property = e.PropertyName;\n\n\t\tvar newTime = new TimeOnly(16, 45);\n\t\ttimePicker.Time = newTime;\n\n\t\tAssert.Equal(nameof(timePicker.Time), property);\n\t}\n\n\t[Fact]\n\tpublic void TimePickerTimeSpanConversion()\n\t{\n\t\tvar timePicker = new TimePicker();\n\t\tvar expectedTime = new TimeOnly(23, 59);\n\t\ttimePicker.Time = expectedTime;\n\n\t\tvar timeSpan = timePicker.Time.ToTimeSpan();\n\t\tAssert.Equal(23, timeSpan.Hours);\n\t\tAssert.Equal(59, timeSpan.Minutes);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/TwoWayBindingExtensionsTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for the BindTwoWay() extension method and two-way data-binding functionality.\n/// </summary>\npublic class TwoWayBindingExtensionsTests\n{\n\t[Fact]\n\tpublic void BindTwoWay_SyncsInitialValue()\n\t{\n\t\t// Arrange\n\t\tvar viewModel = new TestViewModel { Title = \"Hello\" };\n\t\tvar entry = new Entry { Text = \"Initial\" };\n\n\t\t// Act\n\t\tviewModel.BindTwoWay(\n\t\t\tnameof(viewModel.Title), vm => vm.Title, (vm, val) => vm.Title = val,\n\t\t\tentry,\n\t\t\tnameof(entry.Text), () => entry.Text, val => entry.Text = val);\n\n\t\t// Assert\n\t\tAssert.Equal(\"Hello\", entry.Text);\n\t}\n\n\t[Fact]\n\tpublic void BindTwoWay_UpdatesTargetWhenSourceChanges()\n\t{\n\t\t// Arrange\n\t\tvar viewModel = new TestViewModel { Title = \"Initial\" };\n\t\tvar entry = new Entry();\n\t\tviewModel.BindTwoWay(\n\t\t\tnameof(viewModel.Title), vm => vm.Title, (vm, val) => vm.Title = val,\n\t\t\tentry,\n\t\t\tnameof(entry.Text), () => entry.Text, val => entry.Text = val);\n\n\t\t// Act\n\t\tviewModel.Title = \"From ViewModel\";\n\n\t\t// Assert\n\t\tAssert.Equal(\"From ViewModel\", entry.Text);\n\t}\n\n\t[Fact]\n\tpublic void BindTwoWay_UpdatesSourceWhenTargetChanges()\n\t{\n\t\t// Arrange\n\t\tvar viewModel = new TestViewModel { Title = \"Initial\" };\n\t\tvar entry = new Entry();\n\t\tviewModel.BindTwoWay(\n\t\t\tnameof(viewModel.Title), vm => vm.Title, (vm, val) => vm.Title = val,\n\t\t\tentry,\n\t\t\tnameof(entry.Text), () => entry.Text, val => entry.Text = val);\n\n\t\t// Act\n\t\tentry.Text = \"From Entry\";\n\n\t\t// Assert\n\t\tAssert.Equal(\"From Entry\", viewModel.Title);\n\t}\n\n\t[Fact]\n\tpublic void BindTwoWay_PreventsInfiniteLoop()\n\t{\n\t\t// Arrange\n\t\tvar viewModel = new TestViewModel { Title = \"Start\" };\n\t\tvar entry = new Entry();\n\t\tint sourceUpdateCount = 0;\n\t\tint targetUpdateCount = 0;\n\n\t\tviewModel.PropertyChanged += (s, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(viewModel.Title))\n\t\t\t\tsourceUpdateCount++;\n\t\t};\n\n\t\tentry.PropertyChanged += (s, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(entry.Text))\n\t\t\t\ttargetUpdateCount++;\n\t\t};\n\n\t\tviewModel.BindTwoWay(\n\t\t\tnameof(viewModel.Title), vm => vm.Title, (vm, val) => vm.Title = val,\n\t\t\tentry,\n\t\t\tnameof(entry.Text), () => entry.Text, val => entry.Text = val);\n\n\t\t// Reset counts after initial sync\n\t\tsourceUpdateCount = 0;\n\t\ttargetUpdateCount = 0;\n\n\t\t// Act\n\t\tviewModel.Title = \"Changed\";\n\n\t\t// Assert - should only trigger one update in each direction, not infinite\n\t\tAssert.Equal(1, sourceUpdateCount); // One update on the source\n\t\tAssert.Equal(1, targetUpdateCount); // One update on the target\n\t\tAssert.Equal(\"Changed\", entry.Text);\n\t}\n\n\t[Fact]\n\tpublic void BindTwoWay_DoesNotUpdateForOtherProperties()\n\t{\n\t\t// Arrange\n\t\tvar viewModel = new TestViewModel { Title = \"Title\", Count = 0 };\n\t\tvar entry = new Entry();\n\t\tviewModel.BindTwoWay(\n\t\t\tnameof(viewModel.Title), vm => vm.Title, (vm, val) => vm.Title = val,\n\t\t\tentry,\n\t\t\tnameof(entry.Text), () => entry.Text, val => entry.Text = val);\n\n\t\t// Act\n\t\tviewModel.Count = 42; // Change a different property\n\n\t\t// Assert\n\t\tAssert.Equal(\"Title\", entry.Text); // Should not have changed\n\t}\n\n\t[Fact]\n\tpublic void BindTwoWay_DisposalStopsUpdates()\n\t{\n\t\t// Arrange\n\t\tvar viewModel = new TestViewModel { Title = \"Initial\" };\n\t\tvar entry = new Entry();\n\t\tvar binding = viewModel.BindTwoWay(\n\t\t\tnameof(viewModel.Title), vm => vm.Title, (vm, val) => vm.Title = val,\n\t\t\tentry,\n\t\t\tnameof(entry.Text), () => entry.Text, val => entry.Text = val);\n\n\t\t// Act\n\t\tbinding.Dispose();\n\t\tviewModel.Title = \"After Dispose VM\";\n\t\tentry.Text = \"After Dispose Entry\";\n\n\t\t// Assert\n\t\tAssert.Equal(\"After Dispose VM\", viewModel.Title); // VM changed but didn't sync\n\t\tAssert.Equal(\"After Dispose Entry\", entry.Text); // Entry changed but didn't sync\n\t}\n\n\t[Fact]\n\tpublic void BindTwoWay_MultipleDisposalsSafe()\n\t{\n\t\t// Arrange\n\t\tvar viewModel = new TestViewModel { Title = \"Test\" };\n\t\tvar entry = new Entry();\n\t\tvar binding = viewModel.BindTwoWay(\n\t\t\tnameof(viewModel.Title), vm => vm.Title, (vm, val) => vm.Title = val,\n\t\t\tentry,\n\t\t\tnameof(entry.Text), () => entry.Text, val => entry.Text = val);\n\n\t\t// Act & Assert - should not throw\n\t\tbinding.Dispose();\n\t\tbinding.Dispose();\n\t\tbinding.Dispose();\n\t}\n\n\t[Fact]\n\tpublic void BindTwoWay_WorksWithValueTypes()\n\t{\n\t\t// Arrange\n\t\tvar viewModel = new TestViewModel { Count = 42 };\n\t\tvar slider = new Slider { Value = 0 };\n\n\t\t// Act\n\t\tviewModel.BindTwoWay(\n\t\t\tnameof(viewModel.Count), vm => vm.Count, (vm, val) => vm.Count = val,\n\t\t\tslider,\n\t\t\tnameof(slider.Value), () => (int)slider.Value, val => slider.Value = val);\n\n\t\t// Assert\n\t\tAssert.Equal(42, (int)slider.Value);\n\n\t\t// Update from source\n\t\tviewModel.Count = 100;\n\t\tAssert.Equal(100, (int)slider.Value);\n\n\t\t// Update from target\n\t\tslider.Value = 50;\n\t\tAssert.Equal(50, viewModel.Count);\n\t}\n\n\t[Fact]\n\tpublic void BindTwoWay_WorksWithBooleans()\n\t{\n\t\t// Arrange\n\t\tvar viewModel = new TestViewModel { IsEnabled = true };\n\t\tvar checkBox = new CheckBox { IsChecked = false };\n\n\t\t// Act\n\t\tviewModel.BindTwoWay(\n\t\t\tnameof(viewModel.IsEnabled), vm => vm.IsEnabled, (vm, val) => vm.IsEnabled = val,\n\t\t\tcheckBox,\n\t\t\tnameof(checkBox.IsChecked), () => checkBox.IsChecked, val => checkBox.IsChecked = val);\n\n\t\t// Assert\n\t\tAssert.True(checkBox.IsChecked);\n\n\t\t// Update from source\n\t\tviewModel.IsEnabled = false;\n\t\tAssert.False(checkBox.IsChecked);\n\n\t\t// Update from target\n\t\tcheckBox.IsChecked = true;\n\t\tAssert.True(viewModel.IsEnabled);\n\t}\n\n\t[Fact]\n\tpublic void BindTwoWay_ThrowsOnNullSource()\n\t{\n\t\t// Arrange\n\t\tTestViewModel? source = null;\n\t\tvar entry = new Entry();\n\n\t\t// Act & Assert\n\t\tAssert.Throws<ArgumentNullException>(() =>\n\t\t\tsource!.BindTwoWay(\n\t\t\t\tnameof(TestViewModel.Title), vm => vm.Title, (vm, val) => vm.Title = val,\n\t\t\t\tentry,\n\t\t\t\tnameof(entry.Text), () => entry.Text, val => entry.Text = val));\n\t}\n\n\t[Fact]\n\tpublic void BindTwoWay_ThrowsOnNullTarget()\n\t{\n\t\t// Arrange\n\t\tvar viewModel = new TestViewModel();\n\t\tEntry? target = null;\n\n\t\t// Act & Assert\n\t\tAssert.Throws<ArgumentNullException>(() =>\n\t\t\tviewModel.BindTwoWay(\n\t\t\t\tnameof(viewModel.Title), vm => vm.Title, (vm, val) => vm.Title = val,\n\t\t\t\ttarget!,\n\t\t\t\tnameof(Entry.Text), () => string.Empty, val => { }));\n\t}\n\n\t[Fact]\n\tpublic void BindTwoWay_ThrowsOnNullPropertyNames()\n\t{\n\t\t// Arrange\n\t\tvar viewModel = new TestViewModel();\n\t\tvar entry = new Entry();\n\n\t\t// Act & Assert - null source property\n\t\tAssert.Throws<ArgumentNullException>(() =>\n\t\t\tviewModel.BindTwoWay(\n\t\t\t\tnull!, vm => vm.Title, (vm, val) => vm.Title = val,\n\t\t\t\tentry,\n\t\t\t\tnameof(entry.Text), () => entry.Text, val => entry.Text = val));\n\n\t\t// Act & Assert - null target property\n\t\tAssert.Throws<ArgumentNullException>(() =>\n\t\t\tviewModel.BindTwoWay(\n\t\t\t\tnameof(viewModel.Title), vm => vm.Title, (vm, val) => vm.Title = val,\n\t\t\t\tentry,\n\t\t\t\tnull!, () => entry.Text, val => entry.Text = val));\n\t}\n\n\t[Fact]\n\tpublic void BindTwoWay_ThrowsOnNullGettersOrSetters()\n\t{\n\t\t// Arrange\n\t\tvar viewModel = new TestViewModel();\n\t\tvar entry = new Entry();\n\n\t\t// Act & Assert - null source getter\n\t\tAssert.Throws<ArgumentNullException>(() =>\n\t\t\tviewModel.BindTwoWay(\n\t\t\t\tnameof(viewModel.Title), null!, (vm, val) => vm.Title = val,\n\t\t\t\tentry,\n\t\t\t\tnameof(entry.Text), () => entry.Text, val => entry.Text = val));\n\n\t\t// Act & Assert - null source setter\n\t\tAssert.Throws<ArgumentNullException>(() =>\n\t\t\tviewModel.BindTwoWay(\n\t\t\t\tnameof(viewModel.Title), vm => vm.Title, null!,\n\t\t\t\tentry,\n\t\t\t\tnameof(entry.Text), () => entry.Text, val => entry.Text = val));\n\n\t\t// Act & Assert - null target getter\n\t\tAssert.Throws<ArgumentNullException>(() =>\n\t\t\tviewModel.BindTwoWay(\n\t\t\t\tnameof(viewModel.Title), vm => vm.Title, (vm, val) => vm.Title = val,\n\t\t\t\tentry,\n\t\t\t\tnameof(entry.Text), null!, val => entry.Text = val));\n\n\t\t// Act & Assert - null target setter\n\t\tAssert.Throws<ArgumentNullException>(() =>\n\t\t\tviewModel.BindTwoWay(\n\t\t\t\tnameof(viewModel.Title), vm => vm.Title, (vm, val) => vm.Title = val,\n\t\t\t\tentry,\n\t\t\t\tnameof(entry.Text), () => entry.Text, null!));\n\t}\n\n\t[Fact]\n\tpublic void BindTwoWay_SupportsChainedUpdates()\n\t{\n\t\t// Arrange\n\t\tvar vm1 = new TestViewModel { Title = \"First\" };\n\t\tvar vm2 = new TestViewModel { Title = \"Second\" };\n\n\t\t// Act - Bind vm1 to vm2\n\t\tvm1.BindTwoWay(\n\t\t\tnameof(vm1.Title), v => v.Title, (v, val) => v.Title = val,\n\t\t\tvm2,\n\t\t\tnameof(vm2.Title), () => vm2.Title, val => vm2.Title = val);\n\n\t\t// Assert\n\t\tAssert.Equal(\"First\", vm2.Title);\n\n\t\t// Update vm1\n\t\tvm1.Title = \"Updated from VM1\";\n\t\tAssert.Equal(\"Updated from VM1\", vm2.Title);\n\n\t\t// Update vm2\n\t\tvm2.Title = \"Updated from VM2\";\n\t\tAssert.Equal(\"Updated from VM2\", vm1.Title);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/Usings.cs",
    "content": "global using Color = Microsoft.Maui.Graphics.Color;\nglobal using Colors = Microsoft.Maui.Graphics.Colors;\nglobal using Xunit;"
  },
  {
    "path": "tests/Spice.Tests/ViewLifecycleTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for view lifecycle and disposal behavior as per VIEW-LIFECYCLE-SPEC.md.\n/// </summary>\npublic class ViewLifecycleTests\n{\n\t/// <summary>\n\t/// A test view that implements IDisposable to track disposal\n\t/// </summary>\n\tprivate class DisposableView : View, IDisposable\n\t{\n\t\tpublic bool IsDisposed { get; private set; }\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\tIsDisposed = true;\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// A test view that does not implement IDisposable\n\t/// </summary>\n\tprivate class NonDisposableView : View\n\t{\n\t}\n\n\t[Fact]\n\tpublic void NonDisposableViewDoesNotThrowWhenDisposedRecursively()\n\t{\n\t\tvar view = new NonDisposableView();\n\t\t\n\t\t// Should not throw\n\t\tView.DisposeRecursive(view);\n\t}\n\n\t[Fact]\n\tpublic void DisposableViewIsDisposedWhenCallingDisposeRecursive()\n\t{\n\t\tvar view = new DisposableView();\n\t\tAssert.False(view.IsDisposed);\n\n\t\tView.DisposeRecursive(view);\n\n\t\tAssert.True(view.IsDisposed);\n\t}\n\n\t[Fact]\n\tpublic void ChildViewsAreDisposedRecursively()\n\t{\n\t\tvar parent = new DisposableView();\n\t\tvar child1 = new DisposableView();\n\t\tvar child2 = new DisposableView();\n\n\t\tparent.Children.Add(child1);\n\t\tparent.Children.Add(child2);\n\n\t\tAssert.False(parent.IsDisposed);\n\t\tAssert.False(child1.IsDisposed);\n\t\tAssert.False(child2.IsDisposed);\n\n\t\tView.DisposeRecursive(parent);\n\n\t\tAssert.True(parent.IsDisposed);\n\t\tAssert.True(child1.IsDisposed);\n\t\tAssert.True(child2.IsDisposed);\n\t}\n\n\t[Fact]\n\tpublic void NestedChildViewsAreDisposedRecursively()\n\t{\n\t\tvar root = new DisposableView();\n\t\tvar child = new DisposableView();\n\t\tvar grandchild = new DisposableView();\n\n\t\troot.Children.Add(child);\n\t\tchild.Children.Add(grandchild);\n\n\t\tView.DisposeRecursive(root);\n\n\t\tAssert.True(root.IsDisposed);\n\t\tAssert.True(child.IsDisposed);\n\t\tAssert.True(grandchild.IsDisposed);\n\t}\n\n\t[Fact]\n\tpublic void MixedDisposableAndNonDisposableChildrenAreHandled()\n\t{\n\t\tvar parent = new DisposableView();\n\t\tvar disposableChild = new DisposableView();\n\t\tvar nonDisposableChild = new NonDisposableView();\n\n\t\tparent.Children.Add(disposableChild);\n\t\tparent.Children.Add(nonDisposableChild);\n\n\t\tView.DisposeRecursive(parent);\n\n\t\tAssert.True(parent.IsDisposed);\n\t\tAssert.True(disposableChild.IsDisposed);\n\t\t// NonDisposableView doesn't throw and continues normally\n\t}\n\n\t[Fact]\n\tpublic void ChildrenAreDisposedBeforeParent()\n\t{\n\t\tvar disposalOrder = new List<string>();\n\n\t\tvar parent = new DisposableViewWithCallback(\"parent\", disposalOrder);\n\t\tvar child = new DisposableViewWithCallback(\"child\", disposalOrder);\n\n\t\tparent.Children.Add(child);\n\n\t\tView.DisposeRecursive(parent);\n\n\t\tAssert.Equal(2, disposalOrder.Count);\n\t\tAssert.Equal(\"child\", disposalOrder[0]);\n\t\tAssert.Equal(\"parent\", disposalOrder[1]);\n\t}\n\n\t[Fact]\n\tpublic void MultipleChildrenAreDisposedInOrder()\n\t{\n\t\tvar disposalOrder = new List<string>();\n\n\t\tvar parent = new DisposableViewWithCallback(\"parent\", disposalOrder);\n\t\tvar child1 = new DisposableViewWithCallback(\"child1\", disposalOrder);\n\t\tvar child2 = new DisposableViewWithCallback(\"child2\", disposalOrder);\n\t\tvar child3 = new DisposableViewWithCallback(\"child3\", disposalOrder);\n\n\t\tparent.Children.Add(child1);\n\t\tparent.Children.Add(child2);\n\t\tparent.Children.Add(child3);\n\n\t\tView.DisposeRecursive(parent);\n\n\t\tAssert.Equal(4, disposalOrder.Count);\n\t\t// Children disposed first\n\t\tAssert.Equal(\"child1\", disposalOrder[0]);\n\t\tAssert.Equal(\"child2\", disposalOrder[1]);\n\t\tAssert.Equal(\"child3\", disposalOrder[2]);\n\t\t// Parent disposed last\n\t\tAssert.Equal(\"parent\", disposalOrder[3]);\n\t}\n\n\t[Fact]\n\tpublic void ViewWithNoChildrenIsDisposed()\n\t{\n\t\tvar view = new DisposableView();\n\t\t\n\t\tView.DisposeRecursive(view);\n\n\t\tAssert.True(view.IsDisposed);\n\t}\n\n\t[Fact]\n\tpublic void DoubleDisposeDoesNotThrow()\n\t{\n\t\tvar view = new DisposableView();\n\n\t\tView.DisposeRecursive(view);\n\t\tView.DisposeRecursive(view);\n\n\t\tAssert.True(view.IsDisposed);\n\t}\n\n\t[Fact]\n\tpublic void CollectionViewDisposesItemViews()\n\t{\n\t\tvar createdViews = new List<DisposableView>();\n\t\tvar collectionView = new CollectionView\n\t\t{\n\t\t\tItemsSource = new[] { \"A\", \"B\", \"C\" },\n\t\t\tItemTemplate = item =>\n\t\t\t{\n\t\t\t\tvar view = new DisposableView();\n\t\t\t\tcreatedViews.Add(view);\n\t\t\t\treturn view;\n\t\t\t}\n\t\t};\n\n\t\t// Simulate platform creating item views\n\t\tforeach (var item in collectionView.ItemsSource)\n\t\t\tcollectionView.CreateItemView(item);\n\n\t\tAssert.Equal(3, createdViews.Count);\n\t\tAssert.All(createdViews, v => Assert.False(v.IsDisposed));\n\n\t\tView.DisposeRecursive(collectionView);\n\n\t\tAssert.All(createdViews, v => Assert.True(v.IsDisposed));\n\t}\n\n\t[Fact]\n\tpublic void CollectionViewTracksAllCreatedViews()\n\t{\n\t\tvar collectionView = new CollectionView\n\t\t{\n\t\t\tItemTemplate = item => new DisposableView()\n\t\t};\n\n\t\t// Simulate scrolling: multiple views created over time\n\t\tvar view1 = (DisposableView)collectionView.CreateItemView(\"item1\");\n\t\tvar view2 = (DisposableView)collectionView.CreateItemView(\"item2\");\n\t\tvar view3 = (DisposableView)collectionView.CreateItemView(\"item3\");\n\t\tAssert.Equal(3, collectionView._activeItemViews.Count);\n\n\t\t// All get disposed on teardown\n\t\tView.DisposeRecursive(collectionView);\n\t\tAssert.True(view1.IsDisposed);\n\t\tAssert.True(view2.IsDisposed);\n\t\tAssert.True(view3.IsDisposed);\n\t\tAssert.Empty(collectionView._activeItemViews);\n\t}\n\n\t/// <summary>\n\t/// Helper class that tracks disposal order\n\t/// </summary>\n\tprivate class DisposableViewWithCallback : View, IDisposable\n\t{\n\t\tprivate readonly string _name;\n\t\tprivate readonly List<string> _disposalOrder;\n\n\t\tpublic DisposableViewWithCallback(string name, List<string> disposalOrder)\n\t\t{\n\t\t\t_name = name;\n\t\t\t_disposalOrder = disposalOrder;\n\t\t}\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\t_disposalOrder.Add(_name);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/ViewOpacityTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for Opacity property on View\n/// </summary>\npublic class ViewOpacityTests\n{\n\t[Fact]\n\tpublic void OpacityDefaultsToOne()\n\t{\n\t\tvar view = new View();\n\t\tAssert.Equal(1.0, view.Opacity);\n\t}\n\n\t[Fact]\n\tpublic void OpacityCanBeSetToZero()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tOpacity = 0.0\n\t\t};\n\t\tAssert.Equal(0.0, view.Opacity);\n\t}\n\n\t[Fact]\n\tpublic void OpacityCanBeSetToHalf()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tOpacity = 0.5\n\t\t};\n\t\tAssert.Equal(0.5, view.Opacity);\n\t}\n\n\t[Fact]\n\tpublic void OpacityCanBeSetToOne()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tOpacity = 1.0\n\t\t};\n\t\tAssert.Equal(1.0, view.Opacity);\n\t}\n\n\t[Fact]\n\tpublic void OpacityPropertyChangedEventFires()\n\t{\n\t\tstring? propertyName = null;\n\t\tvar view = new View();\n\t\tview.PropertyChanged += (sender, e) => propertyName = e.PropertyName;\n\n\t\tview.Opacity = 0.5;\n\t\tAssert.Equal(nameof(view.Opacity), propertyName);\n\t\tAssert.Equal(0.5, view.Opacity);\n\t}\n\n\t[Fact]\n\tpublic void OpacityWorksOnButton()\n\t{\n\t\tvar button = new Button\n\t\t{\n\t\t\tText = \"Click me\",\n\t\t\tOpacity = 0.5\n\t\t};\n\t\tAssert.Equal(0.5, button.Opacity);\n\t\tAssert.Equal(\"Click me\", button.Text);\n\t}\n\n\t[Fact]\n\tpublic void OpacityWorksOnLabel()\n\t{\n\t\tvar label = new Label\n\t\t{\n\t\t\tText = \"Hello\",\n\t\t\tOpacity = 0.7\n\t\t};\n\t\tAssert.Equal(0.7, label.Opacity);\n\t\tAssert.Equal(\"Hello\", label.Text);\n\t}\n\n\t[Fact]\n\tpublic void OpacityWorksOnBoxView()\n\t{\n\t\tvar boxView = new BoxView\n\t\t{\n\t\t\tBackgroundColor = Colors.Red,\n\t\t\tOpacity = 0.3\n\t\t};\n\t\tAssert.Equal(0.3, boxView.Opacity);\n\t\tAssert.Equal(Colors.Red, boxView.BackgroundColor);\n\t}\n\n\t[Fact]\n\tpublic void OpacityWorksOnActivityIndicator()\n\t{\n\t\tvar activityIndicator = new ActivityIndicator\n\t\t{\n\t\t\tIsRunning = true,\n\t\t\tOpacity = 0.8\n\t\t};\n\t\tAssert.Equal(0.8, activityIndicator.Opacity);\n\t\tAssert.True(activityIndicator.IsRunning);\n\t}\n\n\t[Fact]\n\tpublic void CanToggleOpacity()\n\t{\n\t\tvar view = new View { Opacity = 0.0 };\n\t\tAssert.Equal(0.0, view.Opacity);\n\n\t\tview.Opacity = 0.5;\n\t\tAssert.Equal(0.5, view.Opacity);\n\n\t\tview.Opacity = 1.0;\n\t\tAssert.Equal(1.0, view.Opacity);\n\n\t\tview.Opacity = 0.25;\n\t\tAssert.Equal(0.25, view.Opacity);\n\t}\n\n\t[Fact]\n\tpublic void OpacityWorksInStackLayout()\n\t{\n\t\tvar stackView = new StackLayout();\n\t\tvar button = new Button\n\t\t{\n\t\t\tText = \"Test\",\n\t\t\tOpacity = 0.6\n\t\t};\n\n\t\tstackView.Add(button);\n\t\tAssert.Single(stackView.Children);\n\t\tAssert.Same(button, stackView.Children[0]);\n\t\tAssert.Equal(0.6, button.Opacity);\n\t}\n\n\t[Fact]\n\tpublic void OpacityWorksWithMultipleControls()\n\t{\n\t\tvar label = new Label { Text = \"Label\", Opacity = 0.3 };\n\t\tvar button = new Button { Text = \"Button\", Opacity = 0.5 };\n\t\tvar boxView = new BoxView { BackgroundColor = Colors.Blue, Opacity = 0.7 };\n\n\t\tAssert.Equal(0.3, label.Opacity);\n\t\tAssert.Equal(0.5, button.Opacity);\n\t\tAssert.Equal(0.7, boxView.Opacity);\n\t}\n\n\t[Fact]\n\tpublic void OpacityCanBeSetAfterCreation()\n\t{\n\t\tvar view = new View();\n\t\tAssert.Equal(1.0, view.Opacity);\n\n\t\tview.Opacity = 0.4;\n\t\tAssert.Equal(0.4, view.Opacity);\n\t}\n\n\t[Fact]\n\tpublic void OpacityWorksInContentView()\n\t{\n\t\tvar contentView = new ContentView\n\t\t{\n\t\t\tContent = new Label { Text = \"Inside\", Opacity = 0.2 }\n\t\t};\n\n\t\tAssert.NotNull(contentView.Content);\n\t\tAssert.Equal(0.2, contentView.Content.Opacity);\n\t}\n\n\t[Fact]\n\tpublic void OpacityBelowZeroIsClampedToZero()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tOpacity = -0.5\n\t\t};\n\t\tAssert.Equal(0.0, view.Opacity);\n\t}\n\n\t[Fact]\n\tpublic void OpacityAboveOneIsClampedToOne()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tOpacity = 1.5\n\t\t};\n\t\tAssert.Equal(1.0, view.Opacity);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/ViewSizeTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for Width, Height, WidthRequest, and HeightRequest properties on View\n/// </summary>\npublic class ViewSizeTests\n{\n\t[Fact]\n\tpublic void WidthRequestDefaultsToNegativeOne()\n\t{\n\t\tvar view = new View();\n\t\tAssert.Equal(-1, view.WidthRequest);\n\t}\n\n\t[Fact]\n\tpublic void HeightRequestDefaultsToNegativeOne()\n\t{\n\t\tvar view = new View();\n\t\tAssert.Equal(-1, view.HeightRequest);\n\t}\n\n\t[Fact]\n\tpublic void WidthRequestCanBeSet()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tWidthRequest = 100\n\t\t};\n\t\tAssert.Equal(100, view.WidthRequest);\n\t}\n\n\t[Fact]\n\tpublic void HeightRequestCanBeSet()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tHeightRequest = 200\n\t\t};\n\t\tAssert.Equal(200, view.HeightRequest);\n\t}\n\n\t[Fact]\n\tpublic void WidthRequestCanBeSetToZero()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tWidthRequest = 0\n\t\t};\n\t\tAssert.Equal(0, view.WidthRequest);\n\t}\n\n\t[Fact]\n\tpublic void HeightRequestCanBeSetToZero()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tHeightRequest = 0\n\t\t};\n\t\tAssert.Equal(0, view.HeightRequest);\n\t}\n\n\t[Fact]\n\tpublic void WidthRequestPropertyChangedEventFires()\n\t{\n\t\tstring? propertyName = null;\n\t\tvar view = new View();\n\t\tview.PropertyChanged += (sender, e) => propertyName = e.PropertyName;\n\n\t\tview.WidthRequest = 150;\n\t\tAssert.Equal(nameof(view.WidthRequest), propertyName);\n\t\tAssert.Equal(150, view.WidthRequest);\n\t}\n\n\t[Fact]\n\tpublic void HeightRequestPropertyChangedEventFires()\n\t{\n\t\tstring? propertyName = null;\n\t\tvar view = new View();\n\t\tview.PropertyChanged += (sender, e) => propertyName = e.PropertyName;\n\n\t\tview.HeightRequest = 250;\n\t\tAssert.Equal(nameof(view.HeightRequest), propertyName);\n\t\tAssert.Equal(250, view.HeightRequest);\n\t}\n\n\t[Fact]\n\tpublic void WidthRequestWorksOnButton()\n\t{\n\t\tvar button = new Button\n\t\t{\n\t\t\tText = \"Click me\",\n\t\t\tWidthRequest = 120\n\t\t};\n\t\tAssert.Equal(120, button.WidthRequest);\n\t\tAssert.Equal(\"Click me\", button.Text);\n\t}\n\n\t[Fact]\n\tpublic void HeightRequestWorksOnButton()\n\t{\n\t\tvar button = new Button\n\t\t{\n\t\t\tText = \"Click me\",\n\t\t\tHeightRequest = 50\n\t\t};\n\t\tAssert.Equal(50, button.HeightRequest);\n\t\tAssert.Equal(\"Click me\", button.Text);\n\t}\n\n\t[Fact]\n\tpublic void WidthRequestWorksOnLabel()\n\t{\n\t\tvar label = new Label\n\t\t{\n\t\t\tText = \"Hello\",\n\t\t\tWidthRequest = 80\n\t\t};\n\t\tAssert.Equal(80, label.WidthRequest);\n\t\tAssert.Equal(\"Hello\", label.Text);\n\t}\n\n\t[Fact]\n\tpublic void HeightRequestWorksOnLabel()\n\t{\n\t\tvar label = new Label\n\t\t{\n\t\t\tText = \"Hello\",\n\t\t\tHeightRequest = 30\n\t\t};\n\t\tAssert.Equal(30, label.HeightRequest);\n\t\tAssert.Equal(\"Hello\", label.Text);\n\t}\n\n\t[Fact]\n\tpublic void WidthRequestWorksOnBoxView()\n\t{\n\t\tvar boxView = new BoxView\n\t\t{\n\t\t\tColor = new Color(255, 0, 0),\n\t\t\tWidthRequest = 100\n\t\t};\n\t\tAssert.Equal(100, boxView.WidthRequest);\n\t}\n\n\t[Fact]\n\tpublic void HeightRequestWorksOnBoxView()\n\t{\n\t\tvar boxView = new BoxView\n\t\t{\n\t\t\tColor = new Color(255, 0, 0),\n\t\t\tHeightRequest = 100\n\t\t};\n\t\tAssert.Equal(100, boxView.HeightRequest);\n\t}\n\n\t[Fact]\n\tpublic void CanToggleWidthRequest()\n\t{\n\t\tvar view = new View { WidthRequest = 100 };\n\t\tAssert.Equal(100, view.WidthRequest);\n\n\t\tview.WidthRequest = 200;\n\t\tAssert.Equal(200, view.WidthRequest);\n\n\t\tview.WidthRequest = -1;\n\t\tAssert.Equal(-1, view.WidthRequest);\n\t}\n\n\t[Fact]\n\tpublic void CanToggleHeightRequest()\n\t{\n\t\tvar view = new View { HeightRequest = 100 };\n\t\tAssert.Equal(100, view.HeightRequest);\n\n\t\tview.HeightRequest = 200;\n\t\tAssert.Equal(200, view.HeightRequest);\n\n\t\tview.HeightRequest = -1;\n\t\tAssert.Equal(-1, view.HeightRequest);\n\t}\n\n\t[Fact]\n\tpublic void WidthRequestWorksInStackLayout()\n\t{\n\t\tvar stackLayout = new StackLayout();\n\t\tvar button = new Button\n\t\t{\n\t\t\tText = \"Test\",\n\t\t\tWidthRequest = 150\n\t\t};\n\n\t\tstackLayout.Add(button);\n\t\tAssert.Single(stackLayout.Children);\n\t\tAssert.Same(button, stackLayout.Children[0]);\n\t\tAssert.Equal(150, button.WidthRequest);\n\t}\n\n\t[Fact]\n\tpublic void HeightRequestWorksInStackLayout()\n\t{\n\t\tvar stackLayout = new StackLayout();\n\t\tvar button = new Button\n\t\t{\n\t\t\tText = \"Test\",\n\t\t\tHeightRequest = 60\n\t\t};\n\n\t\tstackLayout.Add(button);\n\t\tAssert.Single(stackLayout.Children);\n\t\tAssert.Same(button, stackLayout.Children[0]);\n\t\tAssert.Equal(60, button.HeightRequest);\n\t}\n\n\t[Fact]\n\tpublic void WidthAndHeightRequestWorkTogether()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tWidthRequest = 100,\n\t\t\tHeightRequest = 200\n\t\t};\n\t\tAssert.Equal(100, view.WidthRequest);\n\t\tAssert.Equal(200, view.HeightRequest);\n\t}\n\n\t[Fact]\n\tpublic void SizeRequestsWorkWithVisibility()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tWidthRequest = 100,\n\t\t\tHeightRequest = 200,\n\t\t\tIsVisible = false\n\t\t};\n\t\tAssert.Equal(100, view.WidthRequest);\n\t\tAssert.Equal(200, view.HeightRequest);\n\t\tAssert.False(view.IsVisible);\n\t}\n\n\t[Fact]\n\tpublic void SizeRequestsWorkWithAlignment()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tWidthRequest = 100,\n\t\t\tHeightRequest = 200,\n\t\t\tHorizontalOptions = LayoutOptions.Start,\n\t\t\tVerticalOptions = LayoutOptions.End\n\t\t};\n\t\tAssert.Equal(100, view.WidthRequest);\n\t\tAssert.Equal(200, view.HeightRequest);\n\t\tAssert.Equal(LayoutOptions.Start, view.HorizontalOptions);\n\t\tAssert.Equal(LayoutOptions.End, view.VerticalOptions);\n\t}\n\n\t[Fact]\n\tpublic void WidthAndHeightPropertiesExist()\n\t{\n\t\tvar view = new View();\n\t\t// Width and Height are read-only properties that return the actual rendered size\n\t\t// Without a layout pass, they should return 0 or a default value\n\t\tvar width = view.Width;\n\t\tvar height = view.Height;\n\t\t\n\t\t// Just verify the properties can be accessed\n\t\tAssert.True(width >= 0);\n\t\tAssert.True(height >= 0);\n\t}\n\n\t[Fact]\n\tpublic void WidthAndHeightWorkOnButton()\n\t{\n\t\tvar button = new Button\n\t\t{\n\t\t\tText = \"Click me\"\n\t\t};\n\t\t\n\t\t// Width and Height should be accessible\n\t\tvar width = button.Width;\n\t\tvar height = button.Height;\n\t\t\n\t\tAssert.True(width >= 0);\n\t\tAssert.True(height >= 0);\n\t}\n\n\t[Fact]\n\tpublic void WidthAndHeightWorkOnLabel()\n\t{\n\t\tvar label = new Label\n\t\t{\n\t\t\tText = \"Hello\"\n\t\t};\n\t\t\n\t\t// Width and Height should be accessible\n\t\tvar width = label.Width;\n\t\tvar height = label.Height;\n\t\t\n\t\tAssert.True(width >= 0);\n\t\tAssert.True(height >= 0);\n\t}\n\n\t[Fact]\n\tpublic void SettingWidthRequestWithHorizontalOptionsFill()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tHorizontalOptions = LayoutOptions.Fill\n\t\t};\n\n\t\tview.WidthRequest = 200;\n\n\t\tAssert.Equal(200, view.WidthRequest);\n\t\tAssert.Equal(LayoutOptions.Fill, view.HorizontalOptions);\n\t}\n\n\t[Fact]\n\tpublic void SettingHeightRequestWithVerticalOptionsFill()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tVerticalOptions = LayoutOptions.Fill\n\t\t};\n\n\t\tview.HeightRequest = 150;\n\n\t\tAssert.Equal(150, view.HeightRequest);\n\t\tAssert.Equal(LayoutOptions.Fill, view.VerticalOptions);\n\t}\n\n\t[Fact]\n\tpublic void ChangingAlignmentAfterSizeRequestsAreSetKeepsRequests()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tHorizontalOptions = LayoutOptions.Start,\n\t\t\tVerticalOptions = LayoutOptions.Start\n\t\t};\n\n\t\tview.WidthRequest = 120;\n\t\tview.HeightRequest = 80;\n\n\t\tview.HorizontalOptions = LayoutOptions.Fill;\n\t\tview.VerticalOptions = LayoutOptions.Fill;\n\n\t\tAssert.Equal(120, view.WidthRequest);\n\t\tAssert.Equal(80, view.HeightRequest);\n\t\tAssert.Equal(LayoutOptions.Fill, view.HorizontalOptions);\n\t\tAssert.Equal(LayoutOptions.Fill, view.VerticalOptions);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/ViewTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Unit tests validating the core behavior and defaults of the View class.\n/// </summary>\npublic class ViewTests\n{\n[Fact]\npublic void ViewCanBeCreated()\n{\nvar view = new View();\nAssert.NotNull(view);\n}\n\n[Fact]\npublic void ChildrenCollectionIsInitialized()\n{\nvar view = new View();\nAssert.NotNull(view.Children);\nAssert.Empty(view.Children);\n}\n\n[Fact]\npublic void HorizontalOptionsDefaultsToStart()\n{\nvar view = new View();\nAssert.Equal(default(LayoutOptions), view.HorizontalOptions);\n}\n\n[Fact]\npublic void VerticalOptionsDefaultsToStart()\n{\nvar view = new View();\nAssert.Equal(default(LayoutOptions), view.VerticalOptions);\n}\n\n[Fact]\npublic void BackgroundColorDefaultsToNull()\n{\nvar view = new View();\nAssert.Null(view.BackgroundColor);\n}\n\n[Fact]\npublic void IsVisibleDefaultsToTrue()\n{\nvar view = new View();\nAssert.True(view.IsVisible);\n}\n\n[Fact]\npublic void IsEnabledDefaultsToTrue()\n{\nvar view = new View();\nAssert.True(view.IsEnabled);\n}\n\n[Fact]\npublic void OpacityDefaultsToOne()\n{\nvar view = new View();\nAssert.Equal(1.0, view.Opacity);\n}\n\n[Fact]\npublic void MarginDefaultsToZero()\n{\nvar view = new View();\nAssert.Equal(0, view.Margin.Left);\nAssert.Equal(0, view.Margin.Top);\nAssert.Equal(0, view.Margin.Right);\nAssert.Equal(0, view.Margin.Bottom);\nAssert.True(view.Margin.IsEmpty);\n}\n\n[Fact]\npublic void WidthRequestDefaultsToNegativeOne()\n{\nvar view = new View();\nAssert.Equal(-1, view.WidthRequest);\n}\n\n[Fact]\npublic void HeightRequestDefaultsToNegativeOne()\n{\nvar view = new View();\nAssert.Equal(-1, view.HeightRequest);\n}\n\n[Fact]\npublic void CanSetHorizontalOptions()\n{\nvar view = new View { HorizontalOptions = LayoutOptions.Start };\nAssert.Equal(LayoutOptions.Start, view.HorizontalOptions);\n}\n\n[Fact]\npublic void CanSetVerticalOptions()\n{\nvar view = new View { VerticalOptions = LayoutOptions.End };\nAssert.Equal(LayoutOptions.End, view.VerticalOptions);\n}\n\n[Fact]\npublic void CanSetBackgroundColor()\n{\nvar color = Colors.Blue;\nvar view = new View { BackgroundColor = color };\nAssert.Equal(color, view.BackgroundColor);\n}\n\n[Fact]\npublic void CanSetIsVisible()\n{\nvar view = new View { IsVisible = false };\nAssert.False(view.IsVisible);\n}\n\n[Fact]\npublic void CanSetIsEnabled()\n{\nvar view = new View { IsEnabled = false };\nAssert.False(view.IsEnabled);\n}\n\n[Fact]\npublic void CanSetOpacity()\n{\nvar view = new View { Opacity = 0.5 };\nAssert.Equal(0.5, view.Opacity);\n}\n\n[Fact]\npublic void CanSetMargin()\n{\nvar view = new View { Margin = new Thickness(10, 20, 30, 40) };\nAssert.Equal(10, view.Margin.Left);\nAssert.Equal(20, view.Margin.Top);\nAssert.Equal(30, view.Margin.Right);\nAssert.Equal(40, view.Margin.Bottom);\n}\n\n[Fact]\npublic void CanSetWidthRequest()\n{\nvar view = new View { WidthRequest = 100 };\nAssert.Equal(100, view.WidthRequest);\n}\n\n[Fact]\npublic void CanSetHeightRequest()\n{\nvar view = new View { HeightRequest = 200 };\nAssert.Equal(200, view.HeightRequest);\n}\n\n[Fact]\npublic void PropertyChangedFiresOnHorizontalOptionsChange()\n{\nvar view = new View();\nvar propertyChangedFired = false;\nview.PropertyChanged += (s, e) =>\n{\nif (e.PropertyName == nameof(View.HorizontalOptions))\npropertyChangedFired = true;\n};\n\nview.HorizontalOptions = LayoutOptions.Fill;\nAssert.True(propertyChangedFired);\n}\n\n[Fact]\npublic void PropertyChangedFiresOnVerticalOptionsChange()\n{\nvar view = new View();\nvar propertyChangedFired = false;\nview.PropertyChanged += (s, e) =>\n{\nif (e.PropertyName == nameof(View.VerticalOptions))\npropertyChangedFired = true;\n};\n\nview.VerticalOptions = LayoutOptions.Fill;\nAssert.True(propertyChangedFired);\n}\n\n[Fact]\npublic void PropertyChangedFiresOnBackgroundColorChange()\n{\nvar view = new View();\nvar propertyChangedFired = false;\nview.PropertyChanged += (s, e) =>\n{\nif (e.PropertyName == nameof(View.BackgroundColor))\npropertyChangedFired = true;\n};\n\nview.BackgroundColor = Colors.Red;\nAssert.True(propertyChangedFired);\n}\n\n[Fact]\npublic void PropertyChangedFiresOnIsVisibleChange()\n{\nvar view = new View();\nvar propertyChangedFired = false;\nview.PropertyChanged += (s, e) =>\n{\nif (e.PropertyName == nameof(View.IsVisible))\npropertyChangedFired = true;\n};\n\nview.IsVisible = false;\nAssert.True(propertyChangedFired);\n}\n\n[Fact]\npublic void PropertyChangedFiresOnIsEnabledChange()\n{\nvar view = new View();\nvar propertyChangedFired = false;\nview.PropertyChanged += (s, e) =>\n{\nif (e.PropertyName == nameof(View.IsEnabled))\npropertyChangedFired = true;\n};\n\nview.IsEnabled = false;\nAssert.True(propertyChangedFired);\n}\n\n[Fact]\npublic void PropertyChangedFiresOnOpacityChange()\n{\nvar view = new View();\nvar propertyChangedFired = false;\nview.PropertyChanged += (s, e) =>\n{\nif (e.PropertyName == nameof(View.Opacity))\npropertyChangedFired = true;\n};\n\nview.Opacity = 0.5;\nAssert.True(propertyChangedFired);\n}\n\n[Fact]\npublic void PropertyChangedFiresOnMarginChange()\n{\nvar view = new View();\nvar propertyChangedFired = false;\nview.PropertyChanged += (s, e) =>\n{\nif (e.PropertyName == nameof(View.Margin))\npropertyChangedFired = true;\n};\n\nview.Margin = new Thickness(10);\nAssert.True(propertyChangedFired);\n}\n\n[Fact]\npublic void PropertyChangedFiresOnWidthRequestChange()\n{\nvar view = new View();\nvar propertyChangedFired = false;\nview.PropertyChanged += (s, e) =>\n{\nif (e.PropertyName == nameof(View.WidthRequest))\npropertyChangedFired = true;\n};\n\nview.WidthRequest = 150;\nAssert.True(propertyChangedFired);\n}\n\n[Fact]\npublic void PropertyChangedFiresOnHeightRequestChange()\n{\nvar view = new View();\nvar propertyChangedFired = false;\nview.PropertyChanged += (s, e) =>\n{\nif (e.PropertyName == nameof(View.HeightRequest))\npropertyChangedFired = true;\n};\n\nview.HeightRequest = 250;\nAssert.True(propertyChangedFired);\n}\n\n[Fact]\npublic void CanAddChildToView()\n{\nvar parent = new View();\nvar child = new View();\n\nparent.Children.Add(child);\n\nAssert.Single(parent.Children);\nAssert.Same(child, parent.Children[0]);\n}\n\n[Fact]\npublic void CanAddMultipleChildren()\n{\nvar parent = new View();\nvar child1 = new View();\nvar child2 = new View();\nvar child3 = new View();\n\nparent.Children.Add(child1);\nparent.Children.Add(child2);\nparent.Children.Add(child3);\n\nAssert.Equal(3, parent.Children.Count);\nAssert.Same(child1, parent.Children[0]);\nAssert.Same(child2, parent.Children[1]);\nAssert.Same(child3, parent.Children[2]);\n}\n\n[Fact]\npublic void CanRemoveChild()\n{\nvar parent = new View();\nvar child = new View();\n\nparent.Children.Add(child);\nAssert.Single(parent.Children);\n\nparent.Children.Remove(child);\nAssert.Empty(parent.Children);\n}\n\n[Fact]\npublic void AddMethodWorksForCollectionInitializer()\n{\nvar parent = new View();\nvar child = new View();\n\nparent.Add(child);\n\nAssert.Single(parent.Children);\nAssert.Same(child, parent.Children[0]);\n}\n\n[Fact]\npublic void ViewIsEnumerable()\n{\nvar parent = new View();\nvar child1 = new View();\nvar child2 = new View();\n\nparent.Children.Add(child1);\nparent.Children.Add(child2);\n\nvar children = new List<View>();\nforeach (var child in parent)\n{\nchildren.Add(child);\n}\n\nAssert.Equal(2, children.Count);\nAssert.Same(child1, children[0]);\nAssert.Same(child2, children[1]);\n}\n\n[Fact]\npublic void CanSetAllPropertiesAtOnce()\n{\nvar view = new View\n{\nHorizontalOptions = LayoutOptions.Start,\nVerticalOptions = LayoutOptions.End,\nBackgroundColor = Colors.Green,\nIsVisible = false,\nIsEnabled = false,\nOpacity = 0.5,\nMargin = new Thickness(5),\nWidthRequest = 300,\nHeightRequest = 400\n};\n\nAssert.Equal(LayoutOptions.Start, view.HorizontalOptions);\nAssert.Equal(LayoutOptions.End, view.VerticalOptions);\nAssert.Equal(Colors.Green, view.BackgroundColor);\nAssert.False(view.IsVisible);\nAssert.False(view.IsEnabled);\nAssert.Equal(0.5, view.Opacity);\nAssert.Equal(5, view.Margin.Left);\nAssert.Equal(300, view.WidthRequest);\nAssert.Equal(400, view.HeightRequest);\n}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/ViewVisibilityTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for IsVisible and IsEnabled properties on View\n/// </summary>\npublic class ViewVisibilityTests\n{\n\t[Fact]\n\tpublic void IsVisibleDefaultsToTrue()\n\t{\n\t\tvar view = new View();\n\t\tAssert.True(view.IsVisible);\n\t}\n\n\t[Fact]\n\tpublic void IsEnabledDefaultsToTrue()\n\t{\n\t\tvar view = new View();\n\t\tAssert.True(view.IsEnabled);\n\t}\n\n\t[Fact]\n\tpublic void IsVisibleCanBeSetToFalse()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tIsVisible = false\n\t\t};\n\t\tAssert.False(view.IsVisible);\n\t}\n\n\t[Fact]\n\tpublic void IsEnabledCanBeSetToFalse()\n\t{\n\t\tvar view = new View\n\t\t{\n\t\t\tIsEnabled = false\n\t\t};\n\t\tAssert.False(view.IsEnabled);\n\t}\n\n\t[Fact]\n\tpublic void IsVisiblePropertyChangedEventFires()\n\t{\n\t\tstring? propertyName = null;\n\t\tvar view = new View();\n\t\tview.PropertyChanged += (sender, e) => propertyName = e.PropertyName;\n\n\t\tview.IsVisible = false;\n\t\tAssert.Equal(nameof(view.IsVisible), propertyName);\n\t\tAssert.False(view.IsVisible);\n\t}\n\n\t[Fact]\n\tpublic void IsEnabledPropertyChangedEventFires()\n\t{\n\t\tstring? propertyName = null;\n\t\tvar view = new View();\n\t\tview.PropertyChanged += (sender, e) => propertyName = e.PropertyName;\n\n\t\tview.IsEnabled = false;\n\t\tAssert.Equal(nameof(view.IsEnabled), propertyName);\n\t\tAssert.False(view.IsEnabled);\n\t}\n\n\t[Fact]\n\tpublic void IsVisibleWorksOnButton()\n\t{\n\t\tvar button = new Button\n\t\t{\n\t\t\tText = \"Click me\",\n\t\t\tIsVisible = false\n\t\t};\n\t\tAssert.False(button.IsVisible);\n\t\tAssert.Equal(\"Click me\", button.Text);\n\t}\n\n\t[Fact]\n\tpublic void IsEnabledWorksOnButton()\n\t{\n\t\tvar button = new Button\n\t\t{\n\t\t\tText = \"Click me\",\n\t\t\tIsEnabled = false\n\t\t};\n\t\tAssert.False(button.IsEnabled);\n\t\tAssert.Equal(\"Click me\", button.Text);\n\t}\n\n\t[Fact]\n\tpublic void IsVisibleWorksOnLabel()\n\t{\n\t\tvar label = new Label\n\t\t{\n\t\t\tText = \"Hello\",\n\t\t\tIsVisible = false\n\t\t};\n\t\tAssert.False(label.IsVisible);\n\t\tAssert.Equal(\"Hello\", label.Text);\n\t}\n\n\t[Fact]\n\tpublic void IsEnabledWorksOnLabel()\n\t{\n\t\tvar label = new Label\n\t\t{\n\t\t\tText = \"Hello\",\n\t\t\tIsEnabled = false\n\t\t};\n\t\tAssert.False(label.IsEnabled);\n\t\tAssert.Equal(\"Hello\", label.Text);\n\t}\n\n\t[Fact]\n\tpublic void IsVisibleWorksOnActivityIndicator()\n\t{\n\t\tvar activityIndicator = new ActivityIndicator\n\t\t{\n\t\t\tIsRunning = true,\n\t\t\tIsVisible = false\n\t\t};\n\t\tAssert.False(activityIndicator.IsVisible);\n\t\tAssert.True(activityIndicator.IsRunning);\n\t}\n\n\t[Fact]\n\tpublic void IsEnabledWorksOnActivityIndicator()\n\t{\n\t\tvar activityIndicator = new ActivityIndicator\n\t\t{\n\t\t\tIsRunning = true,\n\t\t\tIsEnabled = false\n\t\t};\n\t\tAssert.False(activityIndicator.IsEnabled);\n\t\tAssert.True(activityIndicator.IsRunning);\n\t}\n\n\t[Fact]\n\tpublic void CanToggleIsVisible()\n\t{\n\t\tvar view = new View { IsVisible = false };\n\t\tAssert.False(view.IsVisible);\n\n\t\tview.IsVisible = true;\n\t\tAssert.True(view.IsVisible);\n\n\t\tview.IsVisible = false;\n\t\tAssert.False(view.IsVisible);\n\t}\n\n\t[Fact]\n\tpublic void CanToggleIsEnabled()\n\t{\n\t\tvar view = new View { IsEnabled = false };\n\t\tAssert.False(view.IsEnabled);\n\n\t\tview.IsEnabled = true;\n\t\tAssert.True(view.IsEnabled);\n\n\t\tview.IsEnabled = false;\n\t\tAssert.False(view.IsEnabled);\n\t}\n\n\t[Fact]\n\tpublic void IsVisibleWorksInStackLayout()\n\t{\n\t\tvar stackView = new StackLayout();\n\t\tvar button = new Button\n\t\t{\n\t\t\tText = \"Test\",\n\t\t\tIsVisible = false\n\t\t};\n\n\t\tstackView.Add(button);\n\t\tAssert.Single(stackView.Children);\n\t\tAssert.Same(button, stackView.Children[0]);\n\t\tAssert.False(button.IsVisible);\n\t}\n\n\t[Fact]\n\tpublic void IsEnabledWorksInStackLayout()\n\t{\n\t\tvar stackView = new StackLayout();\n\t\tvar button = new Button\n\t\t{\n\t\t\tText = \"Test\",\n\t\t\tIsEnabled = false\n\t\t};\n\n\t\tstackView.Add(button);\n\t\tAssert.Single(stackView.Children);\n\t\tAssert.Same(button, stackView.Children[0]);\n\t\tAssert.False(button.IsEnabled);\n\t}\n}\n"
  },
  {
    "path": "tests/Spice.Tests/WebViewTests.cs",
    "content": "namespace Spice.Tests;\n\n/// <summary>\n/// Tests for the cross-platform WebView view behavior and defaults.\n/// </summary>\n\npublic class WebViewTests\n{\n\t[Fact]\n\tpublic void WebViewCanBeCreated()\n\t{\n\t\tvar webView = new WebView();\n\t\tAssert.NotNull(webView);\n\t}\n\n\t[Fact]\n\tpublic void WebViewInheritsFromView()\n\t{\n\t\tvar webView = new WebView();\n\t\tAssert.IsAssignableFrom<View>(webView);\n\t}\n\n\t[Fact]\n\tpublic void SourcePropertyDefaultsToEmptyString()\n\t{\n\t\tvar webView = new WebView();\n\t\tAssert.Equal(\"\", webView.Source);\n\t}\n\n\t[Fact]\n\tpublic void SourcePropertyCanBeSet()\n\t{\n\t\tvar webView = new WebView { Source = \"https://example.com\" };\n\t\tAssert.Equal(\"https://example.com\", webView.Source);\n\t}\n\n\t[Fact]\n\tpublic void IsJavaScriptEnabledDefaultsToTrue()\n\t{\n\t\tvar webView = new WebView();\n\t\tAssert.True(webView.IsJavaScriptEnabled);\n\t}\n\n\t[Fact]\n\tpublic void IsJavaScriptEnabledCanBeSet()\n\t{\n\t\tvar webView = new WebView { IsJavaScriptEnabled = false };\n\t\tAssert.False(webView.IsJavaScriptEnabled);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnSourceChange()\n\t{\n\t\tvar webView = new WebView();\n\t\tvar propertyChangedFired = false;\n\t\twebView.PropertyChanged += (s, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(WebView.Source))\n\t\t\t\tpropertyChangedFired = true;\n\t\t};\n\n\t\twebView.Source = \"https://example.com\";\n\t\tAssert.True(propertyChangedFired);\n\t}\n\n\t[Fact]\n\tpublic void PropertyChangedFiresOnIsJavaScriptEnabledChange()\n\t{\n\t\tvar webView = new WebView();\n\t\tvar propertyChangedFired = false;\n\t\twebView.PropertyChanged += (s, e) =>\n\t\t{\n\t\t\tif (e.PropertyName == nameof(WebView.IsJavaScriptEnabled))\n\t\t\t\tpropertyChangedFired = true;\n\t\t};\n\n\t\twebView.IsJavaScriptEnabled = false;\n\t\tAssert.True(propertyChangedFired);\n\t}\n\n\t[Fact]\n\tpublic void CanSetAllPropertiesAtOnce()\n\t{\n\t\tvar webView = new WebView\n\t\t{\n\t\t\tSource = \"https://example.com\",\n\t\t\tIsJavaScriptEnabled = false\n\t\t};\n\n\t\tAssert.Equal(\"https://example.com\", webView.Source);\n\t\tAssert.False(webView.IsJavaScriptEnabled);\n\t}\n\n\t[Fact]\n\tpublic void SourceCanBeSetMultipleTimes()\n\t{\n\t\tvar webView = new WebView { Source = \"https://first.com\" };\n\t\tAssert.Equal(\"https://first.com\", webView.Source);\n\t\t\n\t\twebView.Source = \"https://second.com\";\n\t\tAssert.Equal(\"https://second.com\", webView.Source);\n\t}\n\n\t[Fact]\n\tpublic void MultipleWebViewInstancesAreIndependent()\n\t{\n\t\tvar webView1 = new WebView { Source = \"https://first.com\", IsJavaScriptEnabled = true };\n\t\tvar webView2 = new WebView { Source = \"https://second.com\", IsJavaScriptEnabled = false };\n\n\t\tAssert.Equal(\"https://first.com\", webView1.Source);\n\t\tAssert.Equal(\"https://second.com\", webView2.Source);\n\t\tAssert.True(webView1.IsJavaScriptEnabled);\n\t\tAssert.False(webView2.IsJavaScriptEnabled);\n\t}\n}\n"
  }
]